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.
答案 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
}
}
}
}