2017-07-12 248 views
1

我的所有对话框都显示在屏幕的左上角,而不是中心。如何在QtQuick Controls 2屏幕中居中对话框?

让对话框自动更正的最佳方法是什么?

enter image description here

import QtQuick 2.7 
import QtQuick.Controls 2.2 

ApplicationWindow { 
    id: mainWindow 

    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    Component.onCompleted: { 
     showMessageBox('Hey this actually works!'); 
    } 

    function showMessageBox(message) { 
     var component = Qt.createComponent("MessageDialog.qml") 
     if(component.status == Component.Ready) { 
      var dialog = component.createObject(mainWindow) 

      dialog.title = qsTr("Information") 
      dialog.text = message 

      dialog.open() 
     } else 
      console.error(component.errorString()) 
    } 
} 

用非常简单的MessageDialog.qml

import QtQuick 2.7 
import QtQuick.Controls 2.2 

Dialog { 
    standardButtons: DialogButtonBox.Ok 

    property alias text : textContainer.text 

    Text { 
     id: textContainer 

     anchors.fill: parent 

     horizontalAlignment: Qt.AlignLeft 
     verticalAlignment: Qt.AlignTop 
    } 
} 

回答

3

文档提示,该DialogPopup具有x/y坐标 - 的后代。

我认为这将是一个很好的开始来定位它。

要将无济于事:

  • parent.width - 这应该是你的窗口
  • width的宽度 - 这应该是你的Dialog小号宽度
  • parent.height
  • height

计算正确的职位,你应该没问题。

有了这个,你可以创建一个新基类CenteredDialog.qml

Dialog { 
    x: (parent.width - width)/2 
    y: (parent.height - height)/2 
} 

然后用CenteredDialog代替Dialog所有的时间。

此外,动态实例你可以声明文件中的Component,只有采用component.createObject(parentObject, { property1Name : property1Value, property2Name : property2Value ... })语法设定在实例属性。

+0

好的,我改为'QtQuick 2.7'。我正在寻找一种解决方案,我不必关心宽度和高度。使用旧的'QtQuick.Dialogs 1.2'会不好吗? –

+0

这取决于你的用例。对我来说问题是,'Dialog'是通过'QtQuick 2.8'引入的,所以我只能评估底层的'Popup'。 – derM

+0

你确定吗?我是来自这里的'Dialog':https://doc.qt.io/qt-5/qml-qtquick-controls2-dialog.html所以不需要'QtQuick 2.8',对吗? –

1

您可以设置x/y位置(如derM说的),但是您必须重新计算ApplicationWindow的每个大小更改!

下面是另一种解决方案:

ApplicationWindow { 
    id: mainWindow 

    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    Component.onCompleted: { 
     showMessageBox('Hey this actually works!'); 
    } 

    Item { 
     anchors.centerIn: parent 
     width: msgDialog.width 
     height: msgDialog.height 
     MessageDialog { 
      id: msgDialog 
      title: qsTr("Information") 
      visible: false 
     } 
    } 

    function showMessageBox(message) { 
     msgDialog.text = message 
     msgDialog.visible = true 
    } 

UPDATE:用动态实例:

Item { 
    id: dialogParent 
    anchors.centerIn: parent 
} 

function showMessageBox(message) { 
    var component = Qt.createComponent("MessageDialog.qml") 
    if(component.status === Component.Ready) { 
     var dialog = component.createObject(dialogParent) 

     dialog.title = qsTr("Information") 
     dialog.text = message 
     dialog.open() 

     dialogParent.width = dialog.width 
     dialogParent.height = dialog.height 
    } else { 
     console.error(component.errorString()) 
    } 
} 
+0

当我使用'component.createObject'时会有什么缺点吗?我只是想避免当我不使用它们(但)时实例化所有的对话框。 –

+0

不,但您必须在每个实例化时更改该项目的大小。 (我将这个解决方案添加到我的答案中) – Hubi

+0

而且您需要每次重新提取和重新定位“Item”......否则,您的“Dialog”将不在顶层。理想情况下,'Dialog'的父节点是['ApplicationWindow.overlay'](https://doc.qt.io/qt-5/qml-qtquick-controls2-applicationwindow.html#attached-properties)。你可以在ApplicationWindow.overlay层创建一个Item,并且一直重用它,但是你一次只能使用一个Dialog。当您打开另一个尺寸不同的其他尺寸时,请将其关闭,正确的尺寸将不会恢复。 – derM