QML StackView取代任何东西推

时间:2017-02-10 02:19:19

标签: javascript qt qml qtquick2 qt5.6

如何根据以下样本正确切换页面:

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 labs controls 5.6谢谢

编辑: 看起来这个代码仅适用于调试版本而不适用于发布版本。在msvc2015窗口上测试过。我不知道为什么会发生这种情况,有什么指针?

好的,我附上了另一个示例项目here,以使此案例更加清晰。这里有两个问题,第一件事是我收到警告信息" StackView取代任何东西来推动"调试和发布版本之间的不一致行为。调试版本工作正常,我在发布版本中得到了意想不到的结果。

1 个答案:

答案 0 :(得分:1)

虽然我的问题不明确,但由于评论太有限,我会尝试回答问题,以解决代码中的许多问题。

首先进行编辑:

  

编辑:看起来这段代码仅适用于调试版本,不适用于版本构建。在msvc2015窗口上测试过。我不知道为什么会发生这种情况,有什么指针?

因此,您的两个构建设置之间需要有一些实质性的区别。 检查差异,尤其是在构建目录中。任何挥之不去的文件,不应该是旧版本中的那些? 一切都正确汇编了吗?

然后到你的分层:

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

然后你有initialItem设置,将hal1转让给StackView hal2保持在最前面,直到您在StackView中显示一次,因此您应该首先看到hal2

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

folibis 提到的SwipeView使事情变得更容易一些。由于其default property的类型为Component,因此您编写的所有内容SwipeView { ... here ...}都不会立即实例化,而是存储为仅在需要时实例化的Component。这是在显示时,或者可能很快显示(currentItem的左侧或右侧)。所以我们可以看到,从内存消耗的角度来看,两个...View都可以有效地使用。但是,使用方式具有不同的风格,SwipeViewStackView的语义不同。通常SwipeView看起来更自然,当多个页面并行StackView是要走的路,当你明确表达它的名字时: stack项目

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

现在,我希望我能为你提供帮助,即使我可能未能解决你的问题,因为你还没有在你的问题中说明这一点。