沉默的菜鸟 发表于 2020-8-28 00:15

Qt实现一个聊天对话框

本帖最后由 沉默的菜鸟 于 2020-8-28 00:18 编辑

本人喜欢研究IM系统,尤其是桌面端和服务器端。桌面端一般使用Qt或者PyQt等框架来进行界面的构建。IM系统中较为重要的一个部分就是对话框的界面的实现。对话框界面越美观越好用,用户体验就越好,所以绘制一个美观实用的对话界面就尤为重要了。
前几次做IM客户端的界面时,只是简单的使用了Qt的QTextEdit,每次对话就append一段字符串就行,区别自己和另外一个人只是在字符串前面添加一个名称标识。这样的做法一方面简陋,不方便对人聊天时对话框的跳转和数据的存储,另一方面用户体验较差,界面不美观。
所以本次使用QListWidget作为消息的显示方式,每一个QListWidgetItem作为一个消息,为每一个QListWidgetItem设置一个QWidget,方便消息的显示以及使界面更加美观。
对于这个QWidget,绘制其内容有几种方式:

[*]简单地直接new一个QWidget然后通过new布局和new控件,简单粗暴的生成一个QWidget,其中文字的样式选择,图片的设置等都在此时动态地设置。(简单粗暴,但不好控制,调试难度大)
[*]建立两个QWidget地UI类(从左向右和从右向左的两种消息),直接可视化地对界面进行布局和设置控件等,然后每次设置item地QWidget时就new一个这个UI类的实例。(简单易懂,好操作,内存消耗较多)
[*]建立一个QWidget的子类(非UI类),通过paintEvent()函数动态进行绘制。(比较难掌握,调试难,内存消耗低)
这三种方法的我都试过,前两种方法都成功的做出了我想要的结果,但是第三种方法尝试失败了(还导致了我重新卸载和重装Qt好几次{:301_973:},Qt Creator真的难调试)。


我就展示下第二种方法的项目代码吧,
首先时项目结构:

对话界面:

大小(正常)

大小(全屏)
核心算法:

[*]获取输入字符串
[*]通过选定的font-family和font-size算出这个字符串排列成一行的长度
[*]通过给定的label长度算出label的height需要增大的倍数( + 1)
[*]resize item

效果图:

仍未解决的问题:

[*]每行消息hover时颜色会有变化
[*]内存占用高的问题

附件为代码。
欢迎大家提出建议和意见{:301_1003:}

kun775 发表于 2020-8-28 10:40

rainisa 发表于 2020-8-28 10:07
python 有PyQT5可以可视化编辑,但是打包出来的软件体积太大了不知道怎么解决。
给同事做了个小工具,核 ...

做小工具还是用winform方便,微软亲儿子,写出来的软件很小,甚至都不用打包,编译成release就可以分发了,当然了,如果你会wpf的话,wpf更现代化,效果更好看

rainisa 发表于 2020-8-28 10:07

ciker_li 发表于 2020-8-28 09:23
感谢分享,python为什么不做一个像VC、VB那样可视化的GUI编辑器呢

python 有PyQT5可以可视化编辑,但是打包出来的软件体积太大了不知道怎么解决。
给同事做了个小工具,核心代码只有8行,打包出来的软件80MB{:1_925:}

宁采成 发表于 2020-8-28 08:17

        谢谢@Thanks!

wendao_lx 发表于 2020-8-28 08:29

受教了,不错!!

eepp 发表于 2020-8-28 08:39

加油!争取做一个有趣好玩聊天工具!

沉默的菜鸟 发表于 2020-8-28 08:40

eepp 发表于 2020-8-28 08:39
加油!争取做一个有趣好玩聊天工具!

感谢鼓励{:301_987:}

假想的竞争者 发表于 2020-8-28 08:46

非常不错,太牛了!!

slm801 发表于 2020-8-28 08:56

只能看看,学不来。感谢分享!

ciker_li 发表于 2020-8-28 09:23

感谢分享,python为什么不做一个像VC、VB那样可视化的GUI编辑器呢

hualong1009 发表于 2020-8-28 09:25

有意思,可以研究下

tlf 发表于 2020-8-28 09:27

页: [1] 2 3
查看完整版本: Qt实现一个聊天对话框