显示对话框onCompleted无法按预期工作

时间:2015-09-13 18:28:26

标签: android qt qml qtquick2

我想在某种情况下显示Dialog onCompleted(此处省略处理此条件 - 一个简单的if子句)

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.0

ApplicationWindow
{
    id: appWindow

    width: 480
    height: 640
    visible: true


    StackView
    {
        id: stackView
        anchors.fill: parent
        // Implements back key navigation
        focus: true

        initialItem: Item
        {
            width: parent.width
            height: parent.height
            Button { onClicked: dialog.open() }
            // ...
            Component.onCompleted: dialog.open()
        }
    }

    MyDialog {id: dialog }
}

MyDialog.qml

import QtQuick 2.0
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0

Dialog
{
    id: root

    title: "MyDialog"
    standardButtons: Qt.NoButton

    ColumnLayout
    {
        id: column
        width: parent ? parent.width : 200
        Label { text: "hello world"; Layout.fillWidth: true }
    }
}

当我启动应用时,屏幕变暗,并显示Dialog的阴影,就像对话框有width == 0一样。

有时(很少)对话框显示正确。

如果我注释掉Component.onCompleted行并使用Button启动对话框,则会正确显示。

我做错了什么? 我正在使用Qt 5.5 for Android

3 个答案:

答案 0 :(得分:2)

如果在窗口具有合理的几何图形之前打开对话框,则打开该对话框无法正常工作。

安全选项是使用onWidthChanged信号

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.0

ApplicationWindow
{
    id: appWindow

    width: 480
    height: 640
    visible: true


    StackView
    {
        id: stackView
        anchors.fill: parent
        // Implements back key navigation
        focus: true

        initialItem: Item
        {
            property bool firstTime: true
            width: parent.width
            height: parent.height
            // ...
            // width may be called multiple times
            onWidthChanged: if (firstTime) {firstTime = true; dialog.open()}
        }
    }

    MyDialog {id: dialog }
}

答案 1 :(得分:1)

请参阅有关Dialog QML Type的官方文档,您可以在下面找到:

  

注意:不要尝试将对话框的宽度或高度绑定到   内容的宽度或高度,因为Dialog已经尝试调整大小   本身的内容。如果你的目标是改变或消除   边距,您必须覆盖contentItem。如果您的目标只是展示   一个窗口(无论是否模态),你的平台支持它,它是   更简单的使用Window。

因此,在您的情况下,隐藏地设置内部元素的宽度会更好。另一个快速解决方案是添加(例如)具有给定宽度的Rectangle元素作为Dialog的一个内部根元素。您可以在Rectangle内放置其他元素。

答案 2 :(得分:1)

我发布了另一个答案,因为这是另一种方法。我记得我是如何在一些旧项目上实现它的。 AFAIK,目前它是最好的方式。 如果有人提供更好的解决方案,我会非常高兴

您需要添加一个中间元素,例如Timer。此计时器(下面的代码中为tm)必须具有较小的间隔(如30毫秒),并且需要在您想要的事件Component.onCompleted上启动。将您的操作放在此计时器的onTriggered中。

这是代码:

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

    Timer {
        id: tm
        interval: 30
        onTriggered: dialog.open()
    }

    StackView {
        id: stackView
        anchors.fill: parent
        // Implements back key navigation
        focus: true
        initialItem: Item {
            width: parent.width
            height: parent.heonTriggeredight
            Button { onClicked: dialog.open() }
            Component.onCompleted: tm.start()
        }
    }

    MyDialog { id: dialog }
}