nextScreen()在插槽中替换Qml对象会导致错误。是QueuedConnection解决方案吗?

时间:2018-01-24 11:35:17

标签: qt qml

Qt 5.8 / 5.9。我有一个典型的向导,比如使用QML的屏幕,每个都带有后退和下一个按钮。我自己的从QQuickWidget派生的自定义C ++小部件对象是容器。当我在一个屏幕上获得下一个按钮时,我需要加载另一个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.

1 个答案:

答案 0 :(得分:2)

您应该使用类似StackView的内容,而不是替换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
            }
        }
    }
}