QtQuickControls2对话在

时间:2018-04-12 16:08:16

标签: 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
        }
    }

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

1 个答案:

答案 0 :(得分:3)

我也碰到了这个。您需要设置closePolicy,以便仅在按下转义键时关闭它:

closePolicy: Popup.CloseOnEscape

docs提到这个:

  

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

     

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

     

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

     

默认值为false。

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

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

  1. 想要弹出窗口的暗淡效果。
  2. 不希望在其外部发生的触摸事件通过其下方的项目。
  3. 当用户点击弹出窗口时,希望弹出窗口关闭。
  4. 如果您查看小部件,QDialog::modal的文档会说:

      

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

    如果你看Qt::WindowModality

      

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

      

    窗口是应用程序的模态,阻止输入到所有窗口。

    因此,虽然模态QDialog在点击发生时不会关闭,但不允许事件通过和不关闭之间的区别不是新的。