28.qtquick-listview高仿微信好友列表和聊天列表(代码片段)

NQian NQian     2022-11-29     184

关键词:

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.重要组件-实现气泡组件源码

import QtQuick 2.0
import "BubbleNormal.js" as BubbleNormal
import "BubbleBlue.js" as BubbleBlue
import "BubbleBlack.js" as BubbleBlack


Item 
    id: container
    property var bubbleIndex: 0
    property string msgText: ""
    property bool isSend: true
    property int iconHeight: 40
    property int maxWidth: 100

    Canvas 
        id: canvas
        anchors.fill: parent

        onPaint: 
            bubble().drawBubble(getContext(\'2d\'));
        
    

    Text 
        id: text
        text: msgText
        font.pixelSize: 17
        font.family: "Microsoft Yahei"
        wrapMode: Text.WrapAnywhere

        horizontalAlignment:  Text.AlignLeft
        verticalAlignment: Text.AlignVCenter
        anchors.fill: parent
    

    Component.onCompleted: 
        bubble().initText();
        bubble().reUpdateSize();
        canvas.requestPaint();
    

    onBubbleIndexChanged: 
        bubble().initText();
        bubble().reUpdateSize();
        canvas.requestPaint();
    
    function bubble() 
        switch (bubbleIndex) 
            case 0 :  return BubbleNormal
            case 1 :  return BubbleBlue
            case 2 :  return BubbleBlack
            default: return BubbleNormal
        
    

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

 

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

/****************************************************************************
**  聊天列表委托
** Author   : 诺谦 https://www.cnblogs.com/lifexy/
** Create   : 2021-6-12
****************************************************************************/

import QtQuick 2.12
import QtGraphicalEffects 1.12
import "./bubble" as Bubble
import "qrc:/Common.js" as Common

Item 
    id: container
    property var headSrc
    property var myHeadSrc : "qrc:/head/myhead.jpg"
    property var bubbleIndex : 0

    height: _layout.height + 10
    width: ListView.view.width
    state: msgType
    states: [
        State 
              name: "hint"
              AnchorChanges  target: _layout;
                  anchors.horizontalCenter: container.horizontalCenter;
                  anchors.verticalCenter: container.verticalCenter; 
        ,
        State 
              name: "hintDate"
              AnchorChanges  target: _layout;
                  anchors.horizontalCenter: container.horizontalCenter;
                  anchors.verticalCenter: container.verticalCenter; 
        ,
        State 
              name: "recv"
              AnchorChanges  target: _layout;
                  anchors.left: container.left;
                  anchors.verticalCenter: container.verticalCenter; 
        ,
        State 
              name: "send"
              AnchorChanges  target: _layout;
                  anchors.right: container.right;
                  anchors.verticalCenter: container.verticalCenter; 
        
    ]

    Row 
        id: _layout
        anchors.leftMargin: 20
        anchors.rightMargin: 20
        spacing: 4
        layoutDirection : msgType == "send" ? Qt.RightToLeft : Qt.LeftToRight
        HeadImage 
            id: _head
            width : 50
            height : 50
            headUrl: msgType == "recv" ? headSrc : myHeadSrc
            visible: msgType == "recv" || msgType == "send"
        

        Text 
            id: _hint
            visible: msgType == "hintDate" || msgType == "hint"
            text: msgType == "hintDate" ? getChatDate() : msg
            color: "#B0B0B0"
            font.pixelSize: 14
            font.family: "Microsoft Yahei"
            wrapMode: Text.WrapAnywhere
            elide: Text.ElideRight
            width: container.width - 40
            height: 30
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
        

        Bubble.ChatBubble 
            id: _msg
            visible: msgType == "recv" || msgType == "send"
            msgText:  msgType == "recv" || msgType == "send" ?  msg : ""
            isSend: msgType == "send" ? true : false
            iconHeight: _head.height
            maxWidth: container.width - _layout.anchors.leftMargin * 2 - _head.width * 2 - _layout.spacing * 2
            bubbleIndex: container.bubbleIndex
        
    


    // 判断消息时间,与当前时间间隔多久,来动态显示
    function getChatDate () 
        var total = new Date() - date;
        if (total < (1000*60*60*24)) 
            return date.toLocaleTimeString(Qt.locale(), "hh:mm");
         else if (total < (1000*60*60*24) * 2) 
            return "昨天 "+date.toLocaleTimeString(Qt.locale(), "hh:mm");
         else if (total < (1000*60*60*24) * 3) 
            return "前天 "+date.toLocaleTimeString(Qt.locale(), "hh:mm");
         else 
            return date.toLocaleString(Qt.locale(), "yyyy年M月d日 hh:mm");
        
     

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

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

 

android高仿微信图片选择上传工具(代码片段)

...s://github.com/SleepyzzZ/photo-selector话不多说,先上效果图(高仿微信图片选择器):图片选择界面:图片预览界面:批量上传图片:实现的功能介绍:1、图片异步加载,使用Glide开源库实现加载;2、图片的预览... 查看详情

html5的audio实现高仿微信语音播放效果(实际项目)

HTML部分:<divclass="tab-panefadedialog-record"id="dialogRecord"><volistname="dialogRecord"id="record"><divclass="dialog"><spanclass="time">{$record.time}</span><spanclas 查看详情

高仿微信5.2.1主界面及消息提醒

好久没更新博客了,最近在做公司的项目,这也算是我接触的第一个正式项目。通过项目的检验,发现自己积累了一年的知识还是远远不够,想要提高,好的方法是:项目+书+视频+博客。最重要一点:勤动手。最近发现了慕课网... 查看详情

android高仿微信图片选择上传工具(代码片段)

...s://github.com/SleepyzzZ/photo-selector话不多说,先上效果图(高仿微信图片选择器):图片选择界面:图片预览界面:批量上传图片:实现的功能介绍:1、图片异步加载,使用Glide开源库实现加载;2、图片的预览... 查看详情

如何仿微信聊天软件搭建

开发搭建类似微信聊天软件源码要多少钱,仿微信聊天软件源码费用是多少?废话不多说,直接上干货!告诉各位老板,一套源码要收多少费用,在此基础上再添加功能怎么收费。一套源码收费是多少࿰... 查看详情

盘点github上的高仿app项目,b站微博微信等等(代码片段)

...么枯燥。今天给大家介绍GIthub上几个仿造大厂的app项目。高仿微信iOS版:Github地址:https://github.com/nack 查看详情

html5聊天案例|趣聊h5|仿微信界面聊天|红包|语音聊天|地图

之前有开发过一个h5微直播项目,当时里面也用到过聊天模块部分,今天就在之前聊天部分的基础上重新抽离模块,开发了这个h5趣聊项目,功能效果比较类似微信聊天界面。采用html5+css3+Zepto+swiper+wcPop+flex等技术融合开发,实现... 查看详情

wpf截图控件之绘制箭头「仿微信」

...着上周写的截图控件继续更新绘制箭头。1.WPF实现截屏「仿微信」2.WPF实现截屏控件之移动(二)「仿微信」3.WPF截图控件之伸缩(三)「仿微信」4.WPF截图控件之绘制方框与椭圆(四)「仿微信」正文一、首先接着ScreenCut继续发电。1... 查看详情

仿微信添加标签效果

...向微信看齐,微信就是我们的标杆,那我们今天也来仿一仿微信添加的标签功能。只能仿着做了,真是做不到微信的那种体验。甘拜下风。我们上篇学习了shape属性的用法,那我们今天就用shape来做下微信的标签功能。先看一下... 查看详情

仿微信抢红包(js转)

<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>仿微信抢红包</title><style>html,body,div{margin:0;padding:0;}body{background:#EAEAEA;font:16px/1.8"微软雅黑";paddi 查看详情

htmlcss仿微信底部自己定义菜单

...htmlcss实现微信自己定义菜单效果.不多说直接上代码。/***仿微信自己定义菜单**@authorxuyw*@email[email& 查看详情

javascript实现仿微信抢红包

javascript实现仿微信抢红包 demo效果查看:http://www.w3cfuns.com/notes/14456/53bf08daf9b76230b39519fb399a006a实现代码如下:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>仿微信抢红包< 查看详情

vue仿微信网页版|vue+web端聊天室|仿微信客户端vue版(代码片段)

...-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室——vueWebChat,实现了发送消息、表情(动图),图片、视频预览,右键菜单、截屏、截图可直接粘贴至文本框进行发送。二、技术框架MVVM框架:Vue2.5... 查看详情

ios仿微信弹出框lpactionsheet(代码片段)

iOS仿微信弹出框LPActionSheetLPActionSheet是一款轻量级的仿微信弹出框安装从CocoaPods安装CocoaPods可以优雅地管理第三方库(具体使用方式我在另一篇文章有详细介绍,这里不再赘述)第一步:在Podfile文件中写入如下代码pod'LPActionSheet'... 查看详情

wpf实现截屏(仿微信)

...件反馈窗体增加截图功能需求,所以今天来实现一个仿微信的截图。01—效果预览效果预览(更多效果请下载源码体验):02—代码如下一、ScreenCut.cs代码如下us 查看详情

如何用微信加陌陌好友?

参考技术A微信怎样加陌陌好友需要双方同时注册微信和陌陌,都可以通过微信或者陌陌互相添加好友,否则无法通过微信添加陌陌好友,两个软件并不能或者联通使用。陌陌怎么加微信好友80分(1)点击微信的“+”下的“添加... 查看详情

html5仿微信聊天界面微信朋友圈实例

这几天使用H5开发了一个仿微信聊天前端界面,尤其微信底部编辑器那块处理的很好,使用HTML5来开发,虽说功能效果并没有微信那么全,但是也相当不错了,可以发送消息、表情,发送的消息自动回滚定位到底部,另外可以对... 查看详情

使用swift3.0高仿新浪微博

项目地址:https://github.com/SummerHH/swift3.0WeBo使用swift3.0高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连接匹配,@匹配)支持照片浏览,大图浏览,保存图片到相册本地,实现发布微博,发微博添加照... 查看详情