界面预览,后续源码考虑放出

界面预览

主界面

系统配置界面

目前只做了界面,相关功能还未实现,由于没有好的服务平台相关的想法,暂时搁浅了,之前做了一版局域网的,觉得通信协议太low了,不准备用。

后面有好的想法再对接上来。

界面list和聊天气泡都是纯widget绘制的。

void QChatWidget::paintEvent(QPaintEvent *)
{QPainter painter(viewport());painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);painter.fillRect(viewport()->rect(), m_backgroundColor);foreach(QChatSession *session, m_sessions) {if (session->rect().width() > 0 && session->rect().bottom() > 0) {drawItemInfo(&painter, session);}}
}

绘制Item

void QChatWidget::drawItemInfo(QPainter *painter, QChatSession *session)
{painter->save();painter->setPen(QColor("#c9c9c9"));QFont font = this->font();QRect rect = session->rect();painter->setBrush(session->itemBrush());painter->save();painter->setRenderHints(QPainter::TextAntialiasing);painter->drawPath(sessionPath(session->orientation(), rect));painter->restore();QRect rectIcon(QChatSession::Left == session->orientation() ? MARGIN : rect.right() + 8, rect.top() - 10, 48, 48);if (session->icon().isNull()) {painter->setBrush(Qt::NoBrush);painter->setPen(QColor("#333333"));painter->drawRoundedRect(rectIcon, 4, 4);} else {rectIcon.setSize(session->icon().size());painter->drawPixmap(rectIcon, session->icon());}QRect rectText;if (m_isShowName) {painter->setPen("#b2b2b2");painter->save();font.setPixelSize(10);painter->setFont(font);if (QChatSession::Left == session->orientation()) {rectText = QRect(rect.left(), rect.top() - 15, this->width(), 15);painter->drawText(rectText, Qt::AlignVCenter, session->name() + " " + session->datetime());} else {rectText = QRect(viewport()->rect().left(), rect.top() - 15, rect.right(), 15);painter->drawText(rectText, Qt::AlignVCenter | Qt::AlignRight, session->name() + " " + session->datetime());}painter->restore();}if (session->isMoneyBubble()) {rectIcon = QRect(rect.left(), rect.top(), 60, 60);drawIconfont(painter, "#ffffff", session->getMoneyIcon(), 40, rectIcon);rectText = QRect(rectIcon.right(), rect.top(), rect.width() - rectIcon.width() - 10, 60);font.setPixelSize(14);painter->setFont(font);painter->setPen(QColor("#ffffff"));painter->drawText(rectText, Qt::AlignVCenter, session->text());painter->setPen("#b2b2b2");rectText = QRect(rectIcon.left() + 10, rectText.bottom() + 10, rect.width(), 20);font.setPixelSize(12);painter->setFont(font);painter->drawText(rectText, Qt::AlignVCenter, QString("QIPMsg转账"));} else if (session->type() == QChatSession::Face || session->type() == QChatSession::FaceGif) {m_document->setHtml(session->text());painter->translate(rect.topLeft());m_document->drawContents(painter);} else if (session->type() == QChatSession::Audio) {bool isLeft = session->orientation() == QChatSession::Left;rectText = QRect(isLeft ? rect.left() : rect.right() - rect.height(), rect.top(), rect.height(), rect.height());drawIconfont(painter, "#000000", QChar(0xe6a9), 24, rectText);font.setPixelSize(12);painter->setFont(font);int _txtW = textWidth(font, session->getAudioTime());rectText = QRect(isLeft ? rectText.right() + MARGIN : (rectText.left() - _txtW - MARGIN), rect.top(), _txtW, rect.height());;painter->setPen(QColor(isLeft ? "#9c9c9c" : "#000000"));painter->drawText(rectText, Qt::AlignVCenter, session->getAudioTime());if (isLeft && session->isShowDot()) {painter->setPen(Qt::NoPen);painter->setBrush(Qt::red);painter->drawEllipse(rect.right() + 6 , rect.top() + 5, 6, 6);}} else if (session->type() == QChatSession::Files ) {rectIcon = QRect(rect.right() - 55, rect.top() + 8, 48, 48);painter->drawPixmap(rectIcon, session->fileIcon());font.setPixelSize(14);painter->setFont(font);painter->setPen(QColor("#000000"));rectText = QRect(rect.left() + MARGIN, rect.top(), rect.width() - MARGIN - 55, rect.height() * 0.6);QTextOption op;op.setAlignment(Qt::AlignVCenter);op.setWrapMode(QTextOption::WordWrap);painter->drawText(rectText, session->text(), op);painter->setPen("#b2b2b2");rectText = QRect(rectText.left(), rectText.bottom(), rectText.width(), rect.height() * 0.3);font.setPixelSize(12);painter->setFont(font);painter->drawText(rectText, Qt::AlignTop, session->fileSize());if (session->progress() > 0 && session->progress() < 1) {painter->setPen(QPen(QColor("#000095"), 2));qreal xoffset = (rect.width() - MARGIN * 2) * session->progress();painter->drawLine(QPoint(rectText.left(), rect.bottom() - 2),QPoint(rectText.left() + xoffset, rect.bottom() - 2));} else if (1 == session->progress()) {QString strTxt = QString("传输完成,用时 %1 毫秒").arg(session->transMsec());if (!session->fileExists()) {strTxt = QString("文件已清理");}drawItemRemark(painter, rect, strTxt, session->orientation());}}else if (session->type() == QChatSession::Picture) {QRect rectPix = session->rect().adjusted(5, 5, -5, -5);painter->drawPixmap(rectPix, session->picture());}else {rectText = QRect(rect.left() + MARGIN, rect.top(), rect.width() - MARGIN, rect.height());painter->setPen(QColor("#000000"));QTextOption txoption;txoption.setAlignment(Qt::AlignVCenter);txoption.setWrapMode(QTextOption::WordWrap);painter->drawText(rectText, session->text(), txoption);}painter->restore();
}

还有很多好玩的呢:

Qt 微信版本 网络聊天相关推荐

  1. 仿微信的网络聊天室项目开发【完整源码讲解】

    目录 总体开发思路 服务器端 服务器界面设计 建立TCP服务器端通信 建立服务器消息发送输出流 建立服务器消息接收输入流 建立服务器实时消息通信线程 设置服务器通信自由断开 客户端 客户端界面设计 建 ...

  2. 仿微信的网络聊天室项目开发【完整源码讲解,Java一年工作经验面试题

    /*使滚动条置于文本框最下端*/ infoWindow.setSelectionStart(infoWindow.getText().length());JScrollBar jSBInfo = jS ...

  3. 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口、支持Linux编译)...

    在上章https://blog.csdn.net/qq_37997682/article/details/119589754我们已经实现了: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主 ...

  4. Qt Quick实现局域网聊天V4版本(支持GIF动图表情包、消息聊天、拖动缩放窗口、支持Linux编译)

    Qt Quick实现局域网聊天V4版本(支持GIF动图表情包.消息聊天.拖动缩放窗口.支持Linux编译) 随着社交网络的普及,人们的聊天方式也变得更加高效和便捷.在这里,我们将利用Qt Quick构 ...

  5. Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理

    Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理 实验内容和环境:(包括软件平台和硬件平台) QT5.14.1 Ubuntu操作系统 实验内容及步骤 (含源程序): 用QT ...

  6. QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★)

    QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★) 文章目录 QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★) 本篇副标题: 本篇博客讲了什么or解决了什么问 ...

  7. javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)

    1 课程设计目的和任务 本项目的是实现在web应用上进行多人聊天,为以后在大型项目中实现客服在线服务做一个测试,提前了解HTML5新特性,熟练掌握websocket技术. 2 课程设计的主要内容 实现 ...

  8. Qt 微信第三方授权登录实现过程

    文章目录 前言 1. 开发环境 2. 用窗口显示网页 3. 如何判断网页是否加载完成了? 4. 用窗口显示微信登陆二维码网页 5. 登录过程 6. 获取 code 7. 获取 access_token ...

  9. 简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序

    Socket简要阐述 Socket的概念 Socket的英文原义是"孔"或"插座". 在网络编程中,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连 ...

最新文章

  1. 大厂面试篇:五轮面试,阿里offer到手!
  2. 在Windows环境下搭建Android开发环境
  3. IDEA打包成可执行的JAR包
  4. 双十一我们在作战室干什么?零点刚过,我偷偷提交了几行代码!
  5. cisco路由器故障判断及排除 计算机管理与维护
  6. apache配置cgi出错_Apache配置实现cgi-阿里云开发者社区
  7. Python接口自动化实战(第二阶段)- unittest框架
  8. 搜索引擎(包括图片搜索)
  9. 7 爬虫 CrawlSpider类 增量式爬虫 分布式爬虫 生产者消费者模式
  10. 软件业:印度比中国强在哪
  11. Pyke 逻辑编程入门(16):知识库之“问题库”
  12. 【demo】虫眼镜的制作 制作 完了 finish
  13. 服务器如果清理垃圾文件,为citrix服务器清理垃圾文件事件
  14. matlab带下标的字母,matlab的特殊字符(上下标和希腊字母等)
  15. Iot智慧新零售魔镜智能硬件有哪些
  16. docker学习整理
  17. 如何使用电脑还原点还原系统
  18. 使用IDEA 的DBMS 链接达梦数据库
  19. 当代“中青年” 十年对比挑战图鉴,你的十年是这样吗?
  20. 财务自由第一步:如何实现家庭现金流自由化

热门文章

  1. 组件化架构搭建——铺路Android架构师
  2. 漫画:震惊!直觉误判类题目在面试时是如何坑人的?
  3. 对称轴(Symmetry)
  4. C语言之程序在内存中的分布以及内存越界问题
  5. 旅游行业如何做好网络舆情监测?
  6. Flash 与课件制作:视频播放
  7. C#中的多線程-----引自:http://www.daima.com.cn/info/234.htm
  8. 香港进入5G时代!多功能智能灯柱试验计划为5G建设作配合
  9. blank=True, null=True的区别
  10. 功能安全 李艳文_如何理解功能安全管理