QML之自定义模态可拖拽窗口

效果

这里写图片描述

代码

main.qml

import QtQuick 2.5
import Qt.labs.controls 1.0

ApplicationWindow {
    id: root
    visible: true
    width: 840
    height: 680
    title: qsTr("Hello World")

    Button{
        id: btn
        anchors.centerIn: parent
        text: "click"
        onClicked: {
            myDlg.open()
            myDlg.x = parent.width/2 - myDlg.width/2
            myDlg.y = parent.height/2 - myDlg.height/2
        }
    }

    MyDialog{
        id: myDlg
    }
}

MyDialog.qml

import QtQuick 2.0
//Qt5.6之前版本Popop包含在Qt Labs Controls模块中,之后版本Popop包含在Qt Quick Controls模块中
import Qt.labs.controls 1.0

Popup {
    id: root
    x: parent.width/2 - root.width/2
    y: parent.height/2 - root.height/2
    width: 530
    height: 300
    modal: true
    focus: true
    //设置窗口关闭方式为按“Esc”键关闭
    closePolicy: Popup.OnEscape
    //设置窗口的背景控件,不设置的话Popup的边框会显示出来
    background: rect

    Rectangle {
        id: rect
        anchors.fill: parent
        color: "#87C056"
        border.width: 2
        opacity: 1
        radius: 8

        Rectangle{
            width: parent.width-4
            height: 2
            anchors.top: parent.top
            anchors.topMargin: 40
            anchors.left: parent.left
            anchors.leftMargin: 2
            radius: 8
        }

        //设置标题栏区域为拖拽区域
        Text {
            width: parent.width
            height: 40
            anchors.top: parent.top
            text: qsTr("标题栏")
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter

            MouseArea {
                property point clickPoint: "0,0"

                anchors.fill: parent
                acceptedButtons: Qt.LeftButton
                onPressed: {
                    clickPoint  = Qt.point(mouse.x, mouse.y)
                }
                onPositionChanged: {
                    var offset = Qt.point(mouse.x - clickPoint.x, mouse.y - clickPoint.y)
                    setDlgPoint(offset.x, offset.y)
                }
            }
        }

        Label {
            x: 189
            y: 128
            width: 171
            height: 15
            text: qsTr("AAAAAAAAAAAAAAAAAAA")
        }

        Button {
            x: 103
            y: 204
            text: "ok"
            onClicked: {
                root.close()
            }
        }

        Button {
            x: 341
            y: 204
            text: qsTr("cancel")
            onClicked: {
                root.close()
            }
        }
    }

    function setDlgPoint(dlgX ,dlgY)
    {
        //设置窗口拖拽不能超过父窗口
        if(root.x + dlgX < 0)
        {
            root.x = 0
        }
        else if(root.x + dlgX > root.parent.width - root.width)
        {
            root.x = root.parent.width - root.width
        }
        else
        {
            root.x = root.x + dlgX
        }
        if(root.y + dlgY < 0)
        {
            root.y = 0
        }
        else if(root.y + dlgY > root.parent.height - root.height)
        {
            root.y = root.parent.height - root.height
        }
        else
        {
            root.y = root.y + dlgY
        }
    }
}

### 回答1: QML是一种用户界面语言,可以用于开发桌面和移动应用程序。在QML,可以通过弹出自定义模态对话框来实现与用户的交互。下面是一些实现此功能的步骤: 首先,需要创建一个新的QML文件来定义自定义模态对话框的布局和样式。在该文件,可以使用标准QML组件来创建一个对话框,如Rectangle,Text和Button等。 其次,需要定义弹出自定义模态对话框的触发器,通常是一个按钮或菜单项。触发器应该有一个onClick事件处理程序,用来显示或隐藏自定义模态对话框。 然后,在onClick事件处理程序,需要使用Qt Quick Dialogs组件的Dialog组件来创建自定义模态对话框的实例。该组件提供了许多属性和方法,可以用于设置对话框的标题,内容和按钮等。 最后,在自定义模态对话框的QML文件,可以定义与用户交互的信号和槽,例如用户单击按钮时触发的事件。通过使用这些信号和槽,可以实现与用户的高级交互。 通过以上步骤,可以在QML实现弹出自定义模态对话框的功能。在开发过程,还需要注意遵循QML编程最佳实践,例如尽可能使用绑定和模型-视图分离等技术,以提高代码质量和可维护性。 ### 回答2: QML可以通过弹出自定义模态对话框来交互式地与用户进行交互,这主要是通过QML提供的Dialog组件完成的。要弹出自定义模态对话框,需要创建一个新的自定义组件,该组件将作为Dialog的contentItem。 首先,创建一个QML文件作为自定义组件的模板。该模板可以包含所需的所有控件和布局,以及与这些控件相关的可视化效果。例如,一个包含一个文本框和两个按钮的自定义组件可能如下所示: ``` import QtQuick 2.0 Item { id: customDialog width: 200 height: 100 Rectangle { width: parent.width height: parent.height color: "lightgray" border.color: "black" border.width: 1 radius: 6 Text { text: "Enter your name:" anchors.centerIn: parent } TextInput { id: nameInput width: parent.width - 20 height: 20 anchors.top: parent.top anchors.topMargin: 20 anchors.horizontalCenter: parent.horizontalCenter } Row { width: parent.width spacing: 10 anchors.bottom: parent.bottom anchors.bottomMargin: 10 anchors.horizontalCenter: parent.horizontalCenter Button { text: "OK" onClicked: parent.accepted() } Button { text: "Cancel" onClicked: parent.rejected() } } } } ``` 该自定义组件包括一个文本输入框,一个“OK”按钮和一个“Cancel”按钮。在应用程序逻辑,将创建一个与Dialog组件关联的弹出窗口,并将自定义组件添加为该窗口的contentItem。下面是一种可能的方法: ``` import QtQuick 2.0 import QtQuick.Controls 2.3 ApplicationWindow { id: mainWindow width: 300 height: 200 visible: true Button { text: "Open dialog" onClicked: openCustomDialog() } Dialog { id: customDialog title: "Custom dialog" x: (mainWindow.width - width) / 2 y: (mainWindow.height - height) / 2 modal: true contentItem: Item { CustomDialog { id: content anchors.fill: parent } } accepted: { console.log("OK clicked") console.log("Name entered: " + content.nameInput.text) } rejected: { console.log("Cancel clicked") } } function openCustomDialog() { customDialog.open() } } ``` 在这个例子,当用户单击“Open dialog”按钮时,将调用openCustomDialog()函数,该函数将弹出一个自定义模态对话框。该函数将调用Dialog的open()函数,它将显示模态对话框,直到用户单击“OK”或“Cancel”按钮为止。一旦用户单击了其一个按钮,Dialog的accepted或rejected信号将触发。在这些信号的处理程序,可以执行自定义操作,如读取文本输入框输入的数据。 ### 回答3: QML弹出自定义模态对话框通常需要以下步骤: 1. 创建一个自定义QML组件,例如MyDialog.qml,并将其放置在对话框。 2. 在MyDialog.qml定义一个模态属性,以确保对话框在打开时是模态的。例如: Rectangle { // ... 其他属性 property bool modal: true // ... 其他组件 } 3. 在MyDialog.qml添加关闭对话框的行为。例如: Button { text: "Close" onClicked: myDialog.close(); } 4. 在主QML文件,初始化自定义对话框的一个实例,例如: import QtQuick.Controls 2.0 ApplicationWindow { // ... 其他属性 MyDialog { id: myDialog // ... 其他属性 } // ... 其他组件 } 5. 要使对话框出现,你可以向触发它的组件添加一个onClickd行为,例如一个按钮: Button { text: "Open Dialog" onClicked: myDialog.open(); } 上述操作将创建一个自定义QML组件,MyDialog.qml,它是模态的,并允许通过对话框添加关闭按钮来关闭。还要在主QML文件,初始化这个自定义对话框的一个实例,并通过触发组件的onClickd行为,使其出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

画茧自缚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值