分享一个qml开发的Dialog

一、效果预览

二、源码分享

PopwindowWidget.qml

javascript 复制代码
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts


ApplicationWindow {
    id:self
    width: 470
    height: 250
    visible: false
    color: "#00000000"
    flags: Qt.Tool | Qt.FramelessWindowHint|Qt.MSWindowsFixedSizeDialogHint

    signal accept()
    signal reject()

    enum MessageType {Ask, Error,Notice,Wait,Warning}

    Rectangle{
        id:background
        anchors.fill: parent
        radius: 15
        gradient: Gradient{
            GradientStop { position: 0.0; color: "#ffff6111" }
            GradientStop { position: 1.0; color: "#50ff6111" }
        }

        ColumnLayout{
            anchors.fill: parent
            Item {
                Layout.fillWidth: true
                Layout.preferredHeight: background.height/4*3
                Row{
                    anchors.fill: parent
                    Image {
                        id:imageIcon
                        height: 100
                        width: 100
                        anchors.verticalCenter: parent.verticalCenter
                        fillMode: Image.Stretch
                        source: "qrc:/image/images/messageDialog/wait.svg"
                    }
                    Column{
                        width: parent.width-100
                        height: parent.height
                        leftPadding: 20
                        Text {
                            id: textTitle
                            width: parent.width
                            height: parent.height/3
                            text: qsTr("text")
                            font{
                                pointSize: 20
                            }
                            verticalAlignment: Qt.AlignVCenter
                        }
                        Text {
                            id: textMessage
                            width: parent.width
                            height: parent.height/3*2
                            text: qsTr("text")
                            wrapMode: Text.WordWrap
                            font{
                                pointSize: 12
                            }
                            verticalAlignment: Qt.AlignVCenter
                        }
                    }
                }
            }
            Item {
                id:itemBtn
                Layout.fillWidth: true
                Layout.preferredHeight: background.height/4
                Row{
                    id:rowBtn
                    anchors.fill: parent
                    anchors.margins: 10
                    spacing: 3
                    Button{
                        id:btnReject
                        width: 120
                        height: parent.height
                        text: qsTr("取消")
                        hoverEnabled: false
                        background:Rectangle{
                            color: btnReject.down?"#ffb6350a":"#50b6350a"
                            radius: 10
                            MouseArea{
                                anchors.fill: parent
                                cursorShape: Qt.PointingHandCursor;
                            }
                        }

                        Behavior on x{
                            NumberAnimation{
                                id:animBtnReject
                                duration: 500
                            }
                        }
                        onClicked: {
                            close()
                            self.reject()
                        }
                    }
                    Button{
                        id:btnAccept
                        width: 120
                        height: parent.height
                        text: qsTr("确定")
                        hoverEnabled: false
                        background:Rectangle{
                            color: btnAccept.down?"#ff777a05":"#50777a05"
                            radius: 10
                            MouseArea{
                                anchors.fill: parent
                                cursorShape: Qt.PointingHandCursor;
                            }
                        }
                        Behavior on x{
                            NumberAnimation{
                                id:animBtnAccept
                                duration: 300
                            }
                        }
                        onClicked: {
                            close()
                            self.accept()
                        }
                    }
                }
            }
        }
    }

    OpacityAnimator{
        id:showAnim
        target: background
        from: 0
        to:1
        duration: 500
        onFinished: {
            animBtnReject.duration = 500
            animBtnAccept.duration = 300
            btnReject.x = rowBtn.width-btnReject.width-btnAccept.width-rowBtn.spacing
            btnAccept.x = rowBtn.width-btnAccept.width
        }
    }
    OpacityAnimator{
        id:closeAnim
        target: background
        from: 1
        to:0
        duration: 500
        onFinished: {
            self.visible = false

        }
    }

    function show(messageType = PopwindowWidget.MessageType.Error,title=qsTr("未知标题"),message=qsTr("未知内容")){
        if(self.visible)
            return
        self.visible = true
        textTitle.text = title
        textMessage.text = message
        switch(messageType){
            case PopwindowWidget.MessageType.Ask:imageIcon.source = "qrc:/image/images/messageDialog/ask.svg"; break
            case PopwindowWidget.MessageType.Error:imageIcon.source = "qrc:/image/images/messageDialog/error.svg"; break
            case PopwindowWidget.MessageType.Notice:imageIcon.source = "qrc:/image/images/messageDialog/notice.svg"; break
            case PopwindowWidget.MessageType.Wait:imageIcon.source = "qrc:/image/images/messageDialog/wait.svg"; break
            case PopwindowWidget.MessageType.Warning:imageIcon.source = "qrc:/image/images/messageDialog/warning.svg"; break
        }

        showAnim.start()
    }
    function close(){
        if(closeAnim.running || !self.visible)
            return
        animBtnReject.duration = 300
        animBtnAccept.duration = 500
        btnReject.x = 0
        btnAccept.x = btnReject.width+rowBtn.spacing
        closeAnim.start()
    }
}

三、使用方法

main.qml

javascript 复制代码
import QtQuick
import QtQuick.Controls
import Qt.labs.qmlmodels

ApplicationWindow {
    width: 700
    height: 400
    visible: true

    PopwindowWidget{
        id:popwindow
        onAccept: {
            console.log("onAccept")
        }
        onReject: {
            console.log("onReject")
        }
    }
    Row{
        Button{
            width: 200
            height: 200
            text: "show"
            onClicked: {
                popwindow.show()
            }
        }
        Button{
            width: 200
            height: 200
            text: "close"
            onClicked: {
                popwindow.close()
            }
        }
    }


}
相关推荐
百锦再13 小时前
大型省级政务平台采用金仓数据库(KingbaseES)
开发语言·数据库·后端·rust·eclipse
Chloeis Syntax14 小时前
MySQL初阶学习日记(2)--- 数据库的数据类型和表的操作
数据库·学习·mysql
AI绘画小3315 小时前
渗透测试数据库判断卡壳?分类 + 方法 + SQL/NoSQL 脚本速用
服务器·数据库·sql·mysql·web安全·nosql
无敌最俊朗@15 小时前
01-总结
java·jvm·数据库
think2cat16 小时前
图书馆的"备份书库"与"时光机":MongoDB副本集深度揭秘
数据库·mongodb
清风66666616 小时前
基于单片机的多模式智能洗衣机设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
武子康16 小时前
Java-167 Neo4j CQL 实战:CREATE/MATCH 与关系建模速通 案例实测
java·开发语言·数据库·python·sql·nosql·neo4j
Fency咖啡16 小时前
redis进阶 - 底层数据结构
数据结构·数据库·redis
The Sheep 202317 小时前
MicroService(Redis)
数据库·redis·c#