【问题标题】:Stackview Push and Pop destroys and creates a new pageStackview Push and Pop 销毁并创建一个新页面
【发布时间】:2021-05-10 09:39:51
【问题描述】:

我有很多页面,当单击按钮时,我会使用 StackView 在这些页面之间进行转换、推送和弹出。在这些页面中,当点击相应的按钮时,我将这些按钮设为红色。但是,当我按下并重新打开同一页面时,按钮不再是红色的。所以这让我认为 pop 和 push 会破坏并创建一个新页面,这与文档中所写的相反:

这意味着任何推送到 StackView 上的项目将永远不会被 被 StackView 销毁;只有 StackView 从中创建的项目 组件或 URL 被 StackView 销毁。

这里是stackview的代码:

Window{
   id:main
   property bool isAbsOffRoad: false
   StackView{
      id:contentFrame
      initialItem:Qt.resolvedUrl("qrc:/MainPage.qml")
      Connections{
         target:contentFrame.currentItem
         onBackButtonPressed:{
            contentFrame.pop() }
         }}

然后这是我的推动方式:

Item {
   id:backgroundItem
   LeftButtons{
      id:buttonSettings
      MultiPointTouchArea{
         onPressed{
            contentFrame.push("qrc:/SettingsPage.qml")}
}}

我看不出页面在弹出和推回时不保留其状态的原因。可能是什么原因?

另一个问题是:我得到一个

QML 连接:无法分配给不存在的属性 “onBackButtonPressed”。

但是,后退按钮可以工作。为什么会出现这个错误?

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    你引用的文档给了你答案。

    这意味着任何推送到 StackView 上的项目都不会被 StackView 销毁;只有 StackView 从组件创建的项目 ->或 URL

    如果 StackView 从 URL 创建项目,它将拥有该项目的所有权,因此可以随意销毁它。

    您的代码显示了这一点:

    initialItem:Qt.resolvedUrl("qrc:/MainPage.qml")
    

    因此,您为 StackView 提供了 QML 的 URL。如果您不希望它这样做,请尝试这样做:

    initialItem: MainPage {}
    

    这样,StackView 将获得一个完全构造的项目,并且不会尝试销毁它。

    对于您的第二个问题,我猜您的 MainPage.qml 没有定义该信号。您可以在 MainPage 中创建该信号以消除警告,或者您可以尝试将 ignoreUnknownSignals 属性添加到您的 Connections 对象。

    更新:

    您仍然可以使用pushpop。您只需提供项目的创建实例,而不仅仅是项目类型。你可以试试这样的,例如:

        component SomePage: Rectangle {
            signal clicked()
            MouseArea {
                anchors.fill: parent
                onClicked: parent.clicked()
            }
            
            Component.onCompleted: {
                console.log("Created: " + color);
            }
            Component.onDestruction: {
                console.log("Destroyed: " + color);
            }
        }
    
        SomePage {
            id: bluePage
            color: "blue"
            visible: false
            onClicked: contentFrame.push(redPage)
        }
    
        SomePage {
            id: redPage
            color: "red"
            visible: false
            onClicked: contentFrame.pop();
        }
    
        StackView {
            id: contentFrame
            anchors.fill: parent
            initialItem: bluePage
        }
    

    【讨论】:

    • 谢谢,但我不能像这样的页面:contentFrame.push(KontrolPage)。使用 contentFrame.push("qrc:/KontrolPage.qml") 有效。但是,就像您说的那样,以这种方式推动它会使其被破坏并通过推动重新创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2019-01-19
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多