Search code examples
qtqmlqt5qtquick2qtquickcontrols2

How to center dialog on screen in QtQuick Controls 2?


All my dialogs appear on the top left corner of screen instead of the center.

What is the best way to let the dialogs be placed automatically correct?

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())
    }
}

With a very simple 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
    }
}

Solution

  • The documentation for Qt5 hints, that the Dialog is a descendent of Popup which has x/y-coordinates.

    I think those would be a good start to position it.

    To your avail:

    • parent.width - which should be the width of your window
    • width - which should be your Dialogs width
    • parent.height
    • height

    Calculate the right positions, and you should be fine.

    With this you can create a new base class CenteredDialog.qml

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

    and then use CenteredDialog instead of Dialog all the time.

    Further, for dynamic instantiation you might declare the Component in the file, and only set the properties upon instantiation using the component.createObject(parentObject, { property1Name : property1Value, property2Name : property2Value ... }) syntax.

    Note Qt 5.12 and higher can use anchors.centerIn, see answer from @lateus