QML StackView 不替换任何东西来推送

QML StackView replace nothing to push

如何根据以下示例正确切换页面:

import QtQuick 2.6
import QtQuick.Layouts 1.0
import Qt.labs.controls 1.0

ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")

StackView {
    id: stack
    anchors.fill: parent
    initialItem: hal1
}

Pane {
    id: hal1
    anchors.fill: parent
    background: Rectangle {
        id: mystart
        anchors.centerIn: parent
        color: "#2196F3"
    }
}

Pane {
    id: hal2
    anchors.fill: parent
    Label {
        text: qsTr("Second page")
        anchors.centerIn: parent
    }
}

footer: TabBar {
    id: tabBar
    currentIndex: 0
    TabButton {
        text: qsTr("First")
        onClicked: {
           if(stack.currentItem==hal1){
                console.log("dont switch hal1 !")
                return
          }
          stack.replace(hal1)
        }
    }
    TabButton {
        text: qsTr("Second")
        onClicked: {
            if(stack.currentItem==hal2){
                console.log("dont switch hal2 !!")
                return
            }
            stack.replace(hal2)
        }
    }
  }
}

每当单击第一个选项卡时,我想要获取矩形,而第二个选项卡我想要获取我的简单标签。 我正在使用 qt 实验室控件 5.6 谢谢

编辑: 看起来这段代码只适用于调试版本而不适用于发布版本。在 msvc2015 windows 上测试。我不知道为什么会这样,有什么指示吗?

好的,我附上了另一个示例项目 here 以使这个案例更清楚。这里有两个问题,第一件事是我收到警告消息 "StackView replace nothing to push" 以及调试和发布版本之间的不一致行为。调试版本工作正常,我在发布版本时得到了意想不到的结果。

虽然我不清楚你的问题,但由于评论太有限,我尝试给出一个答案,无法解决你代码中的许多问题。

首先为您编辑:

EDIT: Look like this code only works for debug build not for release build. Tested on msvc2015 windows. I do not know exactly why this happen, any pointers?

所以你的两个 build-setups 之间需要有一些实质性的区别。 检查差异,尤其是 build-directories 中的差异。任何挥之不去的文件,也许不应该来自旧版本? 一切都正确编译了吗?

然后是你的分层:

  • 你的第一层是 StackView
  • 在上面你有 hal1
  • 上面你有hal2

然后你有 initialItem 集,它将 hal1 重新设置为 StackView hal2 保持在顶部,直到您将它显示在 StackView 中,因此您应该首先看到 hal2

然后是你对内存消耗的误解:
StackView 不会最小化内存消耗。 当您在 StackView 上推送某些内容时,它只会重新设置为它的父级,并设置为可见。将其弹出时,它会重新设置为原始父级,并变为不可见。要验证我的声明,请记录 Component.onCompletedComponent.onDestruction。前者发生在启动时,后者发生在应用程序关闭时,而不是页面 pushedpopped 时。因此内存消耗一直。防止这种情况的唯一方法是动态创建它们。
Edit 正如 BaCaRoZzo 指出的那样,在使用 StackView 时保持低内存很重要。可以做到,例如通过传递 Component 而不是静态创建的 Item。在这种情况下,StackView 负责创建,对象一旦从堆栈中弹出就被销毁。

folibis 提到的 SwipeView 让事情变得更容易一些。由于它的 default propertyComponent 类型,所以你写 SwipeView { ... here ...} 的任何东西都不会立即实例化,而是存储为 Component 仅在需要时实例化。这是在显示或可能很快显示时(在 currentItem 的左侧或右侧)。所以我们可以看到,从内存消耗的角度来看,两个...View都可以得到有效利用。虽然用法有不同的风格,SwipeViewStackView 的语义不同。通常 SwipeView 看起来更自然,当有多个页面 并行 StackView 是要走的路,当你完全按照它的名字建议做的时候:堆叠物品

谈到要走的路时:为什么选择 Qt.labs.controls 而不是 QtQuick.Controls 2.0?与 labs 版本相比,它们往往更稳定,并且行为应该不太可能因其他版本而改变。

现在,我希望我能帮到你一些事情,尽管我可能没有解决你的问题,因为你还没有在你的问题中说明。