好友
阅读权限20
听众
最后登录1970-1-1
|
沉默的菜鸟
发表于 2020-8-28 00:15
本帖最后由 沉默的菜鸟 于 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好几次,Qt Creator真的难调试)。
我就展示下第二种方法的项目代码吧,
首先时项目结构:
对话界面:
大小(正常)
大小(全屏)
核心算法:
- 获取输入字符串
- 通过选定的font-family和font-size算出这个字符串排列成一行的长度
- 通过给定的label长度算出label的height需要增大的倍数( + 1)
- resize item
效果图:
仍未解决的问题:
附件为代码。
欢迎大家提出建议和意见 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|