Qt nextScreen()Qml对象在插槽中被替换会导致错误。是队列连接解决方案吗?

Qt nextScreen()Qml对象在插槽中被替换会导致错误。是队列连接解决方案吗?,qt,qml,Qt,Qml,Qt 5.8/5.9。我有一个典型的向导式屏幕,使用QML,每个屏幕上都有后退和下一步按钮。我自己的C++ QueWET对象从QQuiWiGET派生出来的是容器。当我在一个屏幕中获得下一个按钮时,我需要加载另一个QML文件。因此,我的QML屏幕的对象树将被替换 例如,单击“下一步”按钮会触发如下行: setSource(QUrl(QLatin1String("qrc:/ProjSel.qml"))); 表示信号的创建者,“下一步”按钮对象本身被替换。在这种情况下,我经常遇到崩溃。为

Qt 5.8/5.9。我有一个典型的向导式屏幕,使用QML,每个屏幕上都有后退和下一步按钮。我自己的C++ QueWET对象从QQuiWiGET派生出来的是容器。当我在一个屏幕中获得下一个按钮时,我需要加载另一个QML文件。因此,我的QML屏幕的对象树将被替换

例如,单击“下一步”按钮会触发如下行:

      setSource(QUrl(QLatin1String("qrc:/ProjSel.qml")));
表示信号的创建者,“下一步”按钮对象本身被替换。在这种情况下,我经常遇到崩溃。为了修复此问题,我使用了QueuedConnection。代码如下。希望我是对的

      QObject::connect(rootObject(),
                 SIGNAL(goNext()),
                 this,
                 SLOT(projectControlNext()),
                 Qt::QueuedConnection); // QML objects tree may be replaced.
                                        // The creator of signal can not be replaced in a slot.
                                        // So Qt::QueuedConnection is important for
                                        // an async execution of slots.

您应该使用类似的内容,而不是替换QQuickWidget的源代码。以文档为例:

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

    StackView {
        id: stack
        initialItem: mainView
        anchors.fill: parent
    }

    Component {
        id: mainView

        Row {
            spacing: 10

            Button {
                text: "Push"
                onClicked: stack.push(mainView)
            }
            Button {
                text: "Pop"
                enabled: stack.depth > 1
                onClicked: stack.pop()

            }
            Text {
                text: stack.depth
            }
        }
    }
}

您应该使用类似的内容,而不是替换QQuickWidget的源代码。以文档为例:

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

    StackView {
        id: stack
        initialItem: mainView
        anchors.fill: parent
    }

    Component {
        id: mainView

        Row {
            spacing: 10

            Button {
                text: "Push"
                onClicked: stack.push(mainView)
            }
            Button {
                text: "Pop"
                enabled: stack.depth > 1
                onClicked: stack.pop()

            }
            Text {
                text: stack.depth
            }
        }
    }
}

美好的我的屏幕也没那么重。因此,性能可能不受欢迎。然而,QueuedConnection在我的上下文中也是正确的。对吗?我绝对不建议通过组件中的一个项目销毁整个QML组件。排队连接的工作可能会起作用,但在IMO的第一个地方仍然是一个狡猾的做法。从广义上讲,如果使用QML而不是C++,那么UI导航(推新屏幕)应该在QML中完成。哦,有没有一种方法可以在不使用C++代码的情况下在QML中推新屏幕?@ VENEUSAV,这就是上面的代码所做的。只需将
stack.push(mainView)
替换为
stack.push(idOfYourScreenType)
。很好。我的屏幕也没那么重。因此,性能可能不受欢迎。然而,QueuedConnection在我的上下文中也是正确的。对吗?我绝对不建议通过组件中的一个项目销毁整个QML组件。排队连接的工作可能会起作用,但在IMO的第一个地方仍然是一个狡猾的做法。从广义上讲,如果使用QML而不是C++,那么UI导航(推新屏幕)应该在QML中完成。哦,有没有一种方法可以在不使用C++代码的情况下在QML中推新屏幕?@ VENEUSAV,这就是上面的代码所做的。只需将
stack.push(mainView)
替换为
stack.push(idOfYourScreenType)