zoukankan      html  css  js  c++  java
  • 37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面、UDP校验登录、皮肤更换、3D旋转)

    1.版本介绍(已上传至群里)

    版本说明:

    • 添加登录界面、
    • UDP校验登录、
    • 皮肤更换、
    • 3D旋转(主界面和登录界面之间切换) 、

    效果图如下所示:

    如果效果图加载失败,可以去哔哩哔哩 https://www.bilibili.com/video/BV1ow411R7Dg浏览

    项目文件结构如下所示:

    下个版本实现:

    • 添加获取好友列表及头像、
    • 好友聊天和表情包收发、
    • 文件收发、

    2.核心代码

    Login.qml如下所示:

    import QtQuick 2.0
    import QtGraphicalEffects 1.12
    import QtQuick.Controls 2.5
    import QtQuick.Layouts 1.12
    import Qt.Singleton 1.0
    import "qrc:/common"
    Rectangle {
        id: container
        color: "#F5F5F5"
        signal closeRequest();
        signal loginRequest();
        SelectFileDialog {
            id: _file
            nameFilters: ["image files (*.png *.jpg)"]
            folder: XmlCfg.fileOpenUrl
            onAccepted: {
                console.log("选择了:  "+files[0])
                if (!XmlCfg.updateHeadImage(files[0])) {
                    popup.hint = "图片格式读取失败!"
                    popup.open();
    
                } else {
    
                }
            }
        }
    
        Row {
            anchors.right: container.right
            ImageButton {
                imageSrc: "qrc:/res/minimize.png"
                backHoverColor: "#E3E3E3"
    
                ToolTip.delay: 1000              // 徘徊在按钮上超过500ms则显示,则默认为直接显示
                ToolTip.visible: hovered       // 当鼠标徘徊在按钮上时,则显示ToolTip
                ToolTip.text: qsTr("最小化")
                onClicked: {
                   showMinimized()
                }
            }
            ImageButton {
                imageSrc: "qrc:/res/close.png"
                hoverimageSrc:"qrc:/res/close_hover.png"
                backHoverColor: "#FA5151"
                ToolTip.delay: 1000              // 徘徊在按钮上超过500ms则显示,则默认为直接显示
                ToolTip.visible: hovered       // 当鼠标徘徊在按钮上时,则显示ToolTip
                ToolTip.text: qsTr("关闭")
                onClicked: closeRequest();
            }
        }
    
        layer.enabled: true
        layer.effect: DropShadow {
        }
    
        YaheiText {
            text: "微信"
            font.pixelSize: 15
            x: 10
            y: 6
            color: "#8E8E8E"
        }
    
        ColumnLayout {
            id: _center
            spacing: 20
            anchors.centerIn: parent
            opacity: 0.0
            HeadImage {
                id: _head
                radius: 8
                width : 100
                height : 100
                headUrl: XmlCfg.headImage
                Layout.alignment: Qt.AlignCenter
                Button {
                    id: _headBtn
                    anchors.fill: parent
                    contentItem: Rectangle {
                        color: "transparent"
                    }
                    background: Rectangle {
                        id: _headBtnBack
                        color: "transparent"
                        border.  2
                        border.color: _headBtn.hovered||_loginAnimation.running ? SkinSingleton.skins[XmlCfg.skinIndex].loginColor :  "transparent"
                        radius: _head.radius
                    }
                    onClicked: {
                        _file.open();
                    }
                }
    
            }
            TextField {
                id: _name
                placeholderText : "请输入你的昵称"
                text: XmlCfg.currentUser
                font.family: "Microsoft Yahei"
                font.pixelSize: 20
                horizontalAlignment: TextField.AlignHCenter
                color: "#666"
                selectedTextColor: "#fff"
                background: Rectangle {
                     border. 0
                     color: "transparent"
                 }
                Layout.fillWidth: false
                Layout.alignment: Qt.AlignCenter
                Layout.preferredWidth: 200
                onTextChanged: {
                    XmlCfg.currentUser = _name.text;
                }
    
            }
    
            BaseButton {
                id: _login
                btnText: "登录"
                Layout.fillWidth: true
                Layout.alignment: Qt.AlignCenter
                bckcolor: SkinSingleton.skins[XmlCfg.skinIndex].loginColor
                onClicked: {
                    _loginAnimation.restart();
                    XmlCfg.SkinIndex = "2";
                    Udp.login();
                }
            }
            YaheiText {
                id: _loginHint
                Layout.alignment: Qt.AlignCenter
                text: ""
                font.pixelSize: 15
                color: SkinSingleton.skins[XmlCfg.skinIndex].loginColor
            }
    
        }
    
        YaheiText {
            anchors.horizontalCenter: container.horizontalCenter
            anchors.bottom: container.bottom
            anchors.bottomMargin: 10
            text: "提示: 用户名必须唯一*"
            font.pixelSize: 13
            color: "#8E8E8E"
        }
    
    
        HintPopup {
            id: popup
            width : 180
            height: 120
            anchors.centerIn: container
            hint: "用户名已被注册!"
        }
    
        SequentialAnimation {
          running: true
          NumberAnimation { target: container;
              properties: "scale"; from: 0.3; to: 1.0; easing.type: Easing.InOutQuad; duration: 200 }
          NumberAnimation { target: _center;
              properties: "opacity"; from: 0; to: 1.0; easing.type: Easing.InOutQuad; duration: 300 }
        }
    
    
    
        SequentialAnimation {
            id: _loginAnimation
            SequentialAnimation {
                loops: 4
    
                ScriptAction {
                    script: _loginHint.text = "登录中."
                }
                NumberAnimation {
                    target: _headBtnBack;
                    property: "opacity";
                    from: 1.0; to: 0.0; duration: 200
                }
                ScriptAction {
                    script: _loginHint.text = "登录中.."
                }
                NumberAnimation {
                    target: _headBtnBack;
                    property: "opacity";
                    from: 0.0; to: 1.0; duration: 200
                }
                ScriptAction {
                    script: {
                        _loginHint.text = "登录中..."
                    }
                }
                PauseAnimation { duration: 100 }
            }
    
            ScriptAction {
                script: {
                    _loginHint.text = "登录成功!"
                }
            }
            PauseAnimation { duration: 1000 }
    
        }
        Connections {
            target: Udp;
            onLoginResult:{
                if (result) {
                    _loginAnimation.stop();
                    _loginHint.text = "用户名已被注册!"
                    popup.hint = "用户名已被注册!"
                    popup.open();
                }
            }
        }
    
        Connections {
            target: _loginAnimation;
            onFinished:{
                console.log(" OK ");
                loginRequest();
            }
        }
    
        function initialize() {
            _loginHint.text = "";
        }
    
    }

    MainWindow.qml如下所示:

    import QtQuick 2.12
    import QtGraphicalEffects 1.12
    import QtQuick.Controls 2.5
    import QtQuick.Layouts 1.12
    import Qt.Singleton 1.0
    import "qrc:/common"
    import "qrc:/bar"
    Rectangle {
        id: container
    
        signal closeRequest();
        signal returnRequest();
    
        gradient:  SkinSingleton.skins[XmlCfg.skinIndex]
    
        RowLayout {
    
            anchors.fill: parent
            spacing: 0
            MenuBar {
                Layout.preferredWidth: 60
                Layout.fillHeight: true
                onReturnRequest: container.returnRequest();
    
            }
            Rectangle {
                color: Qt.rgba(1,1,1, 0.5 + XmlCfg.skinOpacity * 0.3 )
                Layout.preferredWidth: 200
                Layout.fillHeight: true
            }
            Rectangle {
                id: rct
                color: Qt.rgba(1,1,1,0.5 + XmlCfg.skinOpacity * 0.5)
                Layout.fillWidth: true
                Layout.fillHeight: true
    
                Row {
                    anchors.right: rct.right
                    ImageButton {
                        imageSrc: "qrc:/res/minimize.png"
                        backHoverColor: "#E3E3E3"
    
                        ToolTip.delay: 1000              // 徘徊在按钮上超过500ms则显示,则默认为直接显示
                        ToolTip.visible: hovered       // 当鼠标徘徊在按钮上时,则显示ToolTip
                        ToolTip.text: qsTr("最小化")
                        onClicked: {
                           showMinimized()
                        }
                    }
                    ImageButton {
                        imageSrc: "qrc:/res/close.png"
                        hoverimageSrc:"qrc:/res/close_hover.png"
                        backHoverColor: "#FA5151"
                        ToolTip.delay: 1000              // 徘徊在按钮上超过500ms则显示,则默认为直接显示
                        ToolTip.visible: hovered       // 当鼠标徘徊在按钮上时,则显示ToolTip
                        ToolTip.text: qsTr("关闭")
                        onClicked: closeRequest();
                    }
                }
            }
        }
    
    
        layer.enabled: true
        layer.effect: DropShadow {
        }
    
    }

    未完待续~

    下章学习: 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口)


    人间有真情,人间有真爱。

    如果您喜欢这里,感觉对你有帮助,并且有多余的软妹币的话,不妨投个食吧,赞赏的时候,留下美句和你的博客地址哦~   戳这里看谁投食了


  • 相关阅读:
    Remove Element
    C++ 一些STL
    Two Pointers/hash/3Sum/4Sum类题目
    动态规划
    UVa 12657 双向链表
    并行运行环境
    多线程编程
    HTML XML CSS JS 迅速学习
    UVa 11988 数组模拟链表
    静态链表
  • 原文地址:https://www.cnblogs.com/lifexy/p/14990274.html
Copyright © 2011-2022 走看看