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 推送和弹出时,这些信号会激发您对它们各自状态的看法。

如果您以前没有使用过附加信号,这里有一些关于它们如何工作的文档:

https://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#attached-properties-and-attached-signal-handlers