我想在某种情况下显示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
答案 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 }
}