StackView - 弹出屏幕在前一个屏幕可见后被销毁
StackView - Popped screen gets destroyed after previous screen is made visible
StackView 将屏幕 1 作为初始项。屏幕 2 被推送。现在弹出屏幕 2。
屏幕 1 可见后屏幕 2 被销毁。
这是预期的行为吗?为什么会这样?
我预计弹出的屏幕会在上一个屏幕可见之前被破坏。
演示相同的代码:
StackView {
id: stack
initialItem: mainView1
anchors.fill: parent
}
Component {
id: mainView1
Text {
text: "1"
onVisibleChanged: console.log(text, visible)
Component.onCompleted: console.log(text, "completed")
Component.onDestruction: console.log(text, "destroyed")
}
}
Component {
id: mainView2
Text {
text: "2"
onVisibleChanged: console.log(text, visible)
Component.onCompleted: console.log(text, "completed")
Component.onDestruction: console.log(text, "destroyed")
}
}
控制台输出:
qml: 1 completed
qml: Push
qml: 2 completed
qml: 1 false
qml: Pop
qml: 1 true
qml: 2 false
qml: 2 destroyed
问题背后的动机:
我需要从 QML 控制一个 C++ 计时器。计时器需要在 widget 为 created/visible 时启动,在 widget 为 destroyed/hidden.
时停止
上面描述的 StackView 行为阻止我实现它。
当我弹出屏幕 2 时,屏幕 1 首先可见,因此我的计时器启动。然后屏幕 2 被破坏,因此,我的计时器停止了。
之所以会出现这种情况,是因为StackView的动画。在默认的推送和弹出动画期间,这两个视图必须存在,因为它们同时出现在屏幕上。
您可能可以使用 StackView 附加信号解决您的问题:
https://doc.qt.io/qt-5/qml-qtquick-controls2-stackview.html#attached-signals
当 StackView 推送和弹出时,这些信号会激发您对它们各自状态的看法。
如果您以前没有使用过附加信号,这里有一些关于它们如何工作的文档:
StackView 将屏幕 1 作为初始项。屏幕 2 被推送。现在弹出屏幕 2。
屏幕 1 可见后屏幕 2 被销毁。
这是预期的行为吗?为什么会这样?
我预计弹出的屏幕会在上一个屏幕可见之前被破坏。
演示相同的代码:
StackView {
id: stack
initialItem: mainView1
anchors.fill: parent
}
Component {
id: mainView1
Text {
text: "1"
onVisibleChanged: console.log(text, visible)
Component.onCompleted: console.log(text, "completed")
Component.onDestruction: console.log(text, "destroyed")
}
}
Component {
id: mainView2
Text {
text: "2"
onVisibleChanged: console.log(text, visible)
Component.onCompleted: console.log(text, "completed")
Component.onDestruction: console.log(text, "destroyed")
}
}
控制台输出:
qml: 1 completed
qml: Push
qml: 2 completed
qml: 1 false
qml: Pop
qml: 1 true
qml: 2 false
qml: 2 destroyed
问题背后的动机:
我需要从 QML 控制一个 C++ 计时器。计时器需要在 widget 为 created/visible 时启动,在 widget 为 destroyed/hidden.
时停止
上面描述的 StackView 行为阻止我实现它。
当我弹出屏幕 2 时,屏幕 1 首先可见,因此我的计时器启动。然后屏幕 2 被破坏,因此,我的计时器停止了。
之所以会出现这种情况,是因为StackView的动画。在默认的推送和弹出动画期间,这两个视图必须存在,因为它们同时出现在屏幕上。
您可能可以使用 StackView 附加信号解决您的问题:
https://doc.qt.io/qt-5/qml-qtquick-controls2-stackview.html#attached-signals
当 StackView 推送和弹出时,这些信号会激发您对它们各自状态的看法。
如果您以前没有使用过附加信号,这里有一些关于它们如何工作的文档: