上述就是自己做的仿qq的聊天工具,可以发图片,表情,3min间隔发消息显示时间,文件,用户名,恢复历史消息等

IM的整个ui设计
在这里插入图片描述
这是IM发送框的ui,将其提升为TextEdit类:
在这里插入图片描述
1 允许拖拽事件,并显示拖进来的文件图片:

QStringList m_picList;//获取文件链表
QStringList m_fileLsit;//获取图片链表

void TextEdit::dragEnterEvent(QDragEnterEvent *e)
{
	if (e->mimeData()->hasFormat("text/uri-list"))//接受拖拽事件
	{
		e->acceptProposedAction();
	}
	else
	{
		e->ignore();
	}
}

void TextEdit::dropEvent(QDropEvent *e)
{
	QList<QUrl>urls = e->mimeData()->urls();
	if (urls.isEmpty())
		return;
	for (int i = 0; i < urls.size(); i++) {
	//获取拖进来的文件名,并且将文件图片显示在消息框中
		QString filename = urls.at(i).toLocalFile();
		QString extendname = filename.right(4).toLower();
		QUrl Uri(QString("file://%1").arg(filename));
		if (extendname.compare(".jpg") == 0 || extendname.compare(".jpeg") == 0 || extendname.compare(".png") == 0 || extendname.compare(".bmp") == 0)
		{
			QImage image = QImageReader(filename).read();
			QTextDocument *TextDocument = this->document();
			TextDocument->addResource(QTextDocument::ImageResource, Uri, QVariant(image));
			QTextCursor cursor = this->textCursor();
			QTextImageFormat imageformat;
			int nsmall = image.width() / 150;
			imageformat.setWidth(image.width() / nsmall);
			imageformat.setHeight(image.height() / nsmall);
			imageformat.setName(Uri.toString());
			cursor.insertImage(imageformat);
			m_picList.push_back(filename);
			setFocus();
		}
		else
		{
			QImage image = QImageReader(":/Homepage/Resources/images/Homepage/filePressed.png").read();
			QTextDocument * textDocument = this->document();
			textDocument->addResource(QTextDocument::ImageResource, Uri, QVariant(image));
			QTextCursor cursor = this->textCursor();
			QTextImageFormat imageFormat;
			imageFormat.setWidth(image.width());
			imageFormat.setHeight(image.height());
			imageFormat.setName(Uri.toString());
			cursor.insertImage(imageFormat);
			m_fileLsit.push_back(filename);
			setFocus();
		}
	}
}
connect(ui.Btn_SendMessage, &QPushButton::clicked, this, &SendMessageDialog::SlotSendMessage);//点击发送消息
QString text = ui.textEdit->toPlainText();
	QChar qcSlit = (QChar)(0xfffc);
	QStringList textList = text.split(qcSlit);//拆分
	// 把最后一个回车换行符删掉

	while (text.endsWith("\n"))
	{
		text.remove(text.length() - 1, 1);
	}
	if (text.isEmpty())
	{
		QPoint point = ui.widget->mapToGlobal(ui.textEdit->pos());
		QToolTip::showText(point, "发送消息不能为空,请重新输入");
		return;
	}
Logo

网易智企-云信开发者社区是面向全网开发者的技术交流与服务平台,依托近 29 年 IM、音视频技术积累,提供 IM、RTC、实时对话智能体、云原生、短信等全场景开发资源。

更多推荐