经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
28.qt quick-ListView高仿微信好友列表和聊天列表
来源:cnblogs  作者:诺谦  时间:2021/6/15 9:19:40  对本文有异议

1.视图模型介绍 

在Qml中、常见的View视图有:

  • ListView: 列表视图,视图中数据来自ListModel、XmlListModel或c++中继承自QAbstractItemModel或QAbstractListModel的自定义模型类
  • TableView: 和excel类似的视图
  • GridView: 网格视图,类似于home菜单那样,排列着一个个app小图标
  • PathView: 路径视图,可以根据用户自定义的path路径来显示不一样的视图效果
  • SwipeView: 滑动视图,使用一组页面填充。每次只显示一个页面。用户可以通过横向滑动在页面之间导航,一般会将它与PageIndicator结合使用

本章首先来学习ListView.以微信好友列表为例:

里面的每个好友就是由一个个 item 组成的,存在视图中的model里,然后写一个delegate组件,即可通过ListView显示出来.

由于时间不是很多,所以本章实现的微信好友列表和聊天列表(v1版本)是通过模拟数据实现的,等后面有时间后,再来实现个一个真正的内网聊天工具.

 

 2.demo实现(支持自适应)

好友列表如下图所示:

聊天列表如下图所示:

整个效果如下所示:

觉得GIF模糊的话,可以转弯去bilibilihttps://www.bilibili.com/video/BV1Z64y1R7kL/

由于代码上传CSDN,会导致有些同学可能没积分无法下载,所以已经上传群里了.

如果下载后学习有收获,一定要来这里给我点个赞呀,都没动力更新文章了,赞的人太少了

 

 3.重要组件-实现气泡组件源码

  1. import QtQuick 2.0
  2. import "BubbleNormal.js" as BubbleNormal
  3. import "BubbleBlue.js" as BubbleBlue
  4. import "BubbleBlack.js" as BubbleBlack
  5. Item {
  6. id: container
  7. property var bubbleIndex: 0
  8. property string msgText: ""
  9. property bool isSend: true
  10. property int iconHeight: 40
  11. property int maxWidth: 100
  12. Canvas {
  13. id: canvas
  14. anchors.fill: parent
  15. onPaint: {
  16. bubble().drawBubble(getContext('2d'));
  17. }
  18. }
  19. Text {
  20. id: text
  21. text: msgText
  22. font.pixelSize: 17
  23. font.family: "Microsoft Yahei"
  24. wrapMode: Text.WrapAnywhere
  25. horizontalAlignment: Text.AlignLeft
  26. verticalAlignment: Text.AlignVCenter
  27. anchors.fill: parent
  28. }
  29. Component.onCompleted: {
  30. bubble().initText();
  31. bubble().reUpdateSize();
  32. canvas.requestPaint();
  33. }
  34. onBubbleIndexChanged: {
  35. bubble().initText();
  36. bubble().reUpdateSize();
  37. canvas.requestPaint();
  38. }
  39. function bubble() {
  40. switch (bubbleIndex) {
  41. case 0 : return BubbleNormal
  42. case 1 : return BubbleBlue
  43. case 2 : return BubbleBlack
  44. default: return BubbleNormal
  45. }
  46. }
  47. }

 代码如上所示,只要用户更改了bubbleIndex值,那么我们就会去马上调用替换后对应的气泡js文件的function(),进行初始化消息、重绘气泡背景。这个组件实现后,我们如果想实现其它的气泡,也可以直接往里加就好了

 

4.重要组件-实现聊天列表委托源码

  1. /****************************************************************************
  2. ** 聊天列表委托
  3. ** Author : 诺谦 https://www.cnblogs.com/lifexy/
  4. ** Create : 2021-6-12
  5. ****************************************************************************/
  6. import QtQuick 2.12
  7. import QtGraphicalEffects 1.12
  8. import "./bubble" as Bubble
  9. import "qrc:/Common.js" as Common
  10. Item {
  11. id: container
  12. property var headSrc
  13. property var myHeadSrc : "qrc:/head/myhead.jpg"
  14. property var bubbleIndex : 0
  15. height: _layout.height + 10
  16. width: ListView.view.width
  17. state: msgType
  18. states: [
  19. State {
  20. name: "hint"
  21. AnchorChanges { target: _layout;
  22. anchors.horizontalCenter: container.horizontalCenter;
  23. anchors.verticalCenter: container.verticalCenter; }
  24. },
  25. State {
  26. name: "hintDate"
  27. AnchorChanges { target: _layout;
  28. anchors.horizontalCenter: container.horizontalCenter;
  29. anchors.verticalCenter: container.verticalCenter; }
  30. },
  31. State {
  32. name: "recv"
  33. AnchorChanges { target: _layout;
  34. anchors.left: container.left;
  35. anchors.verticalCenter: container.verticalCenter; }
  36. },
  37. State {
  38. name: "send"
  39. AnchorChanges { target: _layout;
  40. anchors.right: container.right;
  41. anchors.verticalCenter: container.verticalCenter; }
  42. }
  43. ]
  44. Row {
  45. id: _layout
  46. anchors.leftMargin: 20
  47. anchors.rightMargin: 20
  48. spacing: 4
  49. layoutDirection : msgType == "send" ? Qt.RightToLeft : Qt.LeftToRight
  50. HeadImage {
  51. id: _head
  52. width : 50
  53. height : 50
  54. headUrl: msgType == "recv" ? headSrc : myHeadSrc
  55. visible: msgType == "recv" || msgType == "send"
  56. }
  57. Text {
  58. id: _hint
  59. visible: msgType == "hintDate" || msgType == "hint"
  60. text: msgType == "hintDate" ? getChatDate() : msg
  61. color: "#B0B0B0"
  62. font.pixelSize: 14
  63. font.family: "Microsoft Yahei"
  64. wrapMode: Text.WrapAnywhere
  65. elide: Text.ElideRight
  66. width: container.width - 40
  67. height: 30
  68. horizontalAlignment: Text.AlignHCenter
  69. verticalAlignment: Text.AlignVCenter
  70. }
  71. Bubble.ChatBubble {
  72. id: _msg
  73. visible: msgType == "recv" || msgType == "send"
  74. msgText: msgType == "recv" || msgType == "send" ? msg : ""
  75. isSend: msgType == "send" ? true : false
  76. iconHeight: _head.height
  77. maxWidth: container.width - _layout.anchors.leftMargin * 2 - _head.width * 2 - _layout.spacing * 2
  78. bubbleIndex: container.bubbleIndex
  79. }
  80. }
  81. // 判断消息时间,与当前时间间隔多久,来动态显示
  82. function getChatDate () {
  83. var total = new Date() - date;
  84. if (total < (1000*60*60*24)) {
  85. return date.toLocaleTimeString(Qt.locale(), "hh:mm");
  86. } else if (total < (1000*60*60*24) * 2) {
  87. return "昨天 "+date.toLocaleTimeString(Qt.locale(), "hh:mm");
  88. } else if (total < (1000*60*60*24) * 3) {
  89. return "前天 "+date.toLocaleTimeString(Qt.locale(), "hh:mm");
  90. } else {
  91. return date.toLocaleString(Qt.locale(), "yyyy年M月d日 hh:mm");
  92. }
  93. }
  94. }

 代码如上所示, 我们会去判断消息类型:

  • 如果消息类型是"hint"类型,就直接居中显示。
  • 如果消息类型是"hintDate"类型,则调用getChatDate()来动态获取要如何显示时间.
  • 如果消息类型是"recv"类型,则靠左显示对方头像,并加上气泡消息
  • 如果消息类型是"send"类型,则靠又显示自己头像,并加上气泡消息

 

原文链接:http://www.cnblogs.com/lifexy/p/14878664.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号