Android 显示未完成的对话框不会';I don’我没有按预期工作
我想在某些条件下显示一个Android 显示未完成的对话框不会';I don’我没有按预期工作,android,qt,qml,qtquick2,Android,Qt,Qml,Qtquick2,我想在某些条件下显示一个对话框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 anc
对话框
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 }
}
}
当我启动我的应用程序时,屏幕变暗,对话框
的阴影出现,好像对话框的宽度=0
有时(很少)对话框显示正确
如果我注释掉组件.onCompleted
行,并使用按钮启动对话框,它将正确显示
我做错了什么?
我正在为Android使用Qt 5.5请参考官方文档,您可以在那里找到下一个:
注意:不要试图将对话框的宽度或高度绑定到
其内容的宽度或高度,因为对话框已尝试调整大小
它本身就是内容。如果您的目标是改变或消除
页边距,则必须覆盖contentItem。如果你的目标只是展示
一个窗口(无论是否为模态),并且您的平台支持它,它是
使用窗口更简单
所以,在您的例子中,最好以某种方式隐式地设置内部元素的宽度。另一个快速解决方案是添加(例如)具有给定宽度的Rectangle
元素作为对话框的一个内部根元素。您可以将其余元素放置在此矩形中
请参阅有关的官方文档,您可以在那里找到下一个:
注意:不要试图将对话框的宽度或高度绑定到
其内容的宽度或高度,因为对话框已尝试调整大小
它本身就是内容。如果您的目标是改变或消除
页边距,则必须覆盖contentItem。如果你的目标只是展示
一个窗口(无论是否为模态),并且您的平台支持它,它是
使用窗口更简单
所以,在您的例子中,最好以某种方式隐式地设置内部元素的宽度。另一个快速解决方案是添加(例如)具有给定宽度的Rectangle
元素作为对话框的一个内部根元素。您可以放置在此矩形中的其余元素
如果在窗口具有正常几何图形之前打开对话框,则打开对话框无法正常工作
一个安全的选择是使用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 }
}
如果在窗口具有正常几何图形之前打开对话框,则无法正确打开对话框
一个安全的选择是使用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 }
}
我发布了另一个答案,因为这是另一种方法。我记得我是如何在一个老项目上实现它的。好吧,现在这是最好的办法。如果有人能给出更好的解决方案,我会非常高兴
您需要添加一个中间元素,如。此计时器(tm
在下面的代码中)必须具有较小的间隔(如30ms),并且需要在所需的事件--组件上启动。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 }
}
我发布了另一个答案,因为这是另一种方法。我记得我是如何在一个老项目上实现它的。好吧,现在这是最好的办法。如果有人能给出更好的解决方案,我会非常高兴
您需要添加一个中间元素,如。此计时器(tm
在下面的代码中)必须具有较小的间隔(如30ms),并且需要在所需的事件--组件上启动。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 }
}
只有在我启动“完成”对话框时才会出现此问题(请参阅更新的OP)。Qt示例本身建议将width
设置为parent.width
,首先请看,您是对的——这是原始示例中有趣的一点。其次,这是一个QML->IMO,永远不能保证100%。这里引用了(Component)[:>文档中相应的处理程序是onCompleted
。它可以在任何对象上声明。运行onCompleted
处理程序的顺序是未定义的。请注意测试--尝试触发对话框。open()
在StackedViewdepth
上更改。是的,就是这样。我发布了一个我制定的解决方案。使用Stack.status
attach属性比使用depth
更有效。如果您有更好的想法,请发布。不,我没有更好的想法。似乎您解决问题的方法还可以。使用Stack.status
并不总是有效。我刚刚发现:(只有当我启动对话框onCompleted
(参见更新的OP)时,问题才会出现).Qt示例本身建议将width
设置为parent.width
,首先,您是对的——这是原始示例中有趣的一点。其次,它是一个QML->IMO,永远不能保证100%。下面是从文档到(组件)的引用[:>对应的处理程序是onCompleted
。它可以在任何对象上声明。运行onCompleted
处理程序的顺序未定义。只是一个测试注意事项--尝试触发对话框。open()
在StackedViewdepth
上更改。是的,就是这样。我发布了一个我制定的解决方案。使用Stack.status
attach属性比使用depth
更有效。如果您有更好的想法,请发布。不,我没有更好的想法。似乎您解决问题的方法还可以。使用Stack.status
并不总是有效。我刚刚发现:(