QML 聊天控件

基于 腾讯IM的 QML 聊天控件,支持at 某人

 

效果如下:

 

源码如下:

import QtQuick 2.0
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4

Item {
    property int space: 17
    property string toCHead : ""
    Connections{
        target: IMController
        onReceiveMessage:{
            appendData(name,content,time,1)
            chatView.positionViewAtEnd()
        }

        onFindMember:{
            imMembers.addMember(name,id)
        }

    }

    ListModel{
        id:chatModel

        ListElement{
            chatNameE:"xxx"
            chatFlagE:1
            chatContentsE:"今晚吃啥?"
            chatTimeE:"1397031550000"
        }

        ListElement{
            chatNameE:"xxxx"
            chatFlagE:0
            chatContentsE:"蒸羊羔、蒸熊掌、蒸鹿尾儿、烧花鸭、烧雏鸡、烧子鹅、卤猪、卤鸭、酱鸡、腊肉、松花小肚儿、晾肉香肠、什锦苏盘、熏鸡白肚儿、清蒸八宝猪、江米酿鸭子、罐儿野鸡、罐儿鹌鹑、卤什锦、卤子鹅、山鸡、兔脯、菜蟒"
            chatTimeE:"1397031554530"
        }
    }
    Rectangle{
        id:viewRect
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.topMargin: space
        anchors.leftMargin: space
        anchors.rightMargin: space
        anchors.bottom: input.top
        ListView{
            id:chatView
            anchors.fill: parent
            spacing:12
            delegate: IMItem{
                width: chatView.width
                chatName: chatNameE
                chatContents: chatContentsE
                chatTime: chatTimeE
                chatFlag: chatFlagE
            }
            clip:true
            model:chatModel
        }
    }
    IMScrollBar{
        id:scBar
        anchors.right: viewRect.right
        anchors.rightMargin: 2
        anchors.top: viewRect.top
        anchors.bottom: viewRect.bottom
        width: 10
        scrollColor: "#dbe1e5"
        opacity: 0
        orientation: Qt.Vertical
        position: chatView.visibleArea.yPosition
        pageSize: chatView.visibleArea.heightRatio
        clip: true
    }
    states: State {
        name: "ShowBars"
        when: chatView.movingVertically || chatView.movingHorizontally
        PropertyChanges { target: scBar; opacity: 1 }
    }



    //

    function appendData(name,str,time,iflag,isGroup)
    {
        if(iflag === 0)
        {
            chatModel.append({"chatNameE": name,  "chatContentsE":str, "chatFlagE":0,"chatTimeE":time});
            IMController.sendMessage(str,isGroup)
        }else{
            console.log("IMArea ",name,str,time)
            chatModel.append({"chatNameE": name,  "chatContentsE":str, "chatFlagE":1,"chatTimeE":time});
        }
    }

    Rectangle{
        id:input
        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.right: parent.right

        anchors.leftMargin: space
        anchors.rightMargin: space
        anchors.bottomMargin: space
        height: enabled?30:0
        radius: 6
        border.color: "#FFC45C"

        onEnabledChanged: {
            if(!enabled){
                content.text=""
            }
        }
        TextField{
            id:content
            anchors.fill: parent
            maximumLength:30
            placeholderText: qsTr("请输入你想说的…")
            style: TextFieldStyle {
                textColor: "black"
                background: Rectangle {
                    opacity: 0
                }
                font {
                    pointSize: 10
                }
            }
            Keys.onReturnPressed:{
                var curTime=new Date().getTime();
                var tmpTime= curTime.toString();

                var isGroup
                console.log("onReturnPressed",content.text.search(toCHead),toCHead)
                if(content.text.search(toCHead) != -1&&toCHead.length>1){
                    isGroup=0
                }else{
                    isGroup=1
                }
                appendData(MainController.teacherName(),content.text,tmpTime,0,isGroup)

                chatView.positionViewAtEnd()
                content.text=""
            }
            onTextChanged: {
                if(content.text==="@") {
                    imMembers.clearData()
                    IMController.GetGroupMemberInfoList()

                    imMembers.openDia()
                }else{
                    imMembers.closeDia()
                }
            }
        }
    }

    IMGroupMembers {
        id:imMembers
        anchors.bottom: input.bottom
        anchors.left: input.left
        anchors.bottomMargin: 20
        anchors.leftMargin: 20
        onCurIDChanged: {
            toCHead = "@"+curID+" "
            content.text = toCHead
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值