QtQuickControls2对话框在点击外部时消失

num*_*her 5 qt qml qt-quick qtquickcontrols2

我正在尝试使用 QtQuickControls2 对话框:

    Dialog {
        id: dialog
        x: parent.width/2-width/2
        y: parent.height/2-height/2
        width:300
        height:200
        title: "Warning"
        modal: true
        standardButtons: Dialog.Ok
        visible: false
        onAccepted: console.log("Ok clicked")
    }


    Button {
        id: button
        objectName: "doSomethingButton"
        onClicked: {
            if(problemFlag==true)
                dialog.visible=true
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果按钮被点击并且problemFlag是 ,它应该被触发true。我读到如果modal设置为true用户无法与程序的其余部分交互。但是,如果我单击对话框外的某处,它就会消失(无需单击“确定”)。

Mit*_*tch 4

我也遇到了这个。您需要设置,closePolicy使其仅在按下转义键时关闭:

closePolicy: Popup.CloseOnEscape
Run Code Online (Sandbox Code Playgroud)

文档提到了这一点

该属性保存弹出窗口是否是模态的。

模态弹出窗口通常具有在overlay.modal中定义的独特背景变暗效果,并且不允许按下或释放事件到达其下方的项目。

在桌面平台上,通常只有在按下退出键时才会关闭模式弹出窗口。要实现此行为,请将 closePolicy 设置为 Popup.CloseOnEscape。

默认值为 false。

区别很难看出,但确实存在:模式弹出窗口不允许按下或释放事件到达其下方的项目,但这并不意味着它们不会关闭

我不记得这背后的原因,但如果我不得不猜测,我会说这与 Qt Quick Controls 2 是首先为移动设备构建的事实有关。在移动设备上,您通常:

  1. 想要弹出窗口的调光效果。
  2. 不希望在其外部发生的触摸事件传递到其下方的项目。
  3. 希望当用户点击弹出窗口外部时关闭弹出窗口。

如果您查看小部件,文档会QDialog::modal说:

将此属性设置为 true 相当于将 QWidget::windowModality 设置为 Qt::ApplicationModal。

如果你接着看Qt::WindowModality

该枚举指定模式窗口的行为。模态窗口是一种阻止其他窗口输入的窗口。[...]

和:

该窗口对于应用程序来说是模态的,并阻止所有窗口的输入。

因此,尽管模态QDialog框在外部发生点击时不会关闭,但不让事件通过和不关闭之间的区别并不是一个新概念。