Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 显示未完成的对话框不会';I don’我没有按预期工作_Android_Qt_Qml_Qtquick2 - Fatal编程技术网

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()
在StackedView
depth
上更改。是的,就是这样。我发布了一个我制定的解决方案。使用
Stack.status
attach属性比使用
depth
更有效。如果您有更好的想法,请发布。不,我没有更好的想法。似乎您解决问题的方法还可以。使用
Stack.status
并不总是有效。我刚刚发现:(只有当我启动对话框
onCompleted
(参见更新的OP)时,问题才会出现).Qt示例本身建议将
width
设置为
parent.width
,首先,您是对的——这是原始示例中有趣的一点。其次,它是一个QML->IMO,永远不能保证100%。下面是从文档到(组件)的引用[:>对应的处理程序是
onCompleted
。它可以在任何对象上声明。运行
onCompleted
处理程序的顺序未定义。只是一个测试注意事项--尝试触发
对话框。open()
在StackedView
depth
上更改。是的,就是这样。我发布了一个我制定的解决方案。使用
Stack.status
attach属性比使用
depth
更有效。如果您有更好的想法,请发布。不,我没有更好的想法。似乎您解决问题的方法还可以。使用
Stack.status
并不总是有效。我刚刚发现:(