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