【问题标题】:QtQuickControls2 Dialog vanishing on click outsideQtQuickControls2对话框在点击外部消失
【发布时间】:2018-04-12 16:08:16
【问题描述】:

我正在尝试使用 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
        }
    }

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

【问题讨论】:

    标签: qt qml qt-quick qtquickcontrols2


    【解决方案1】:

    我也遇到过。您需要设置closePolicy,使其仅在按下退出键时关闭:

    closePolicy: Popup.CloseOnEscape
    

    docs 提到这一点:

    此属性保存弹出窗口是否为模态。

    模态弹出窗口通常具有独特的背景调光效果 在 overlay.modal 中定义,并且不允许按下或释放事件 一直到它们下面的项目。

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

    默认值为假。

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

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

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

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

    将此属性设置为 true 等效于设置 QWidget::windowModality 到 Qt::ApplicationModal。

    如果你再看看Qt::WindowModality:

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

    和:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多