【发布时间】:2017-02-10 02:19:18
【问题描述】:
如何根据以下示例在页面之间正确切换:
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 replace nothing to push”以及调试和发布版本之间的不一致行为。调试构建工作正常,我在发布构建时得到了意外的结果。
【问题讨论】:
-
应用程序启动时
hal1已经在堆栈上。当您按First时,您正试图用hal1替换hal1,这是没有意义的。 -
@folibis,感谢您指出这一点。我已经解决了这个问题,并且行为仍然相同。我在这里看到了非常奇怪的不一致行为。无论如何我已经在这里提交了关于这个案例的错误报告bugreports.qt.io/browse/QTBUG-58765
-
对我来说,我认为使用替换
StackView并没有多大意义,因为堆叠容器的正确逻辑是推送。可能你需要SwipeView或类似的东西。 -
我已经使用替换功能编写了许多 qml 东西,根据一些文档,这里的替换意味着简单的弹出“快捷方式”然后推送项目。我真的很喜欢这个:)。我想通过加载必要的页面来最小化内存消耗,而 StackView 是我真正的致命工具箱:)
-
正如@folibis 指出的那样,
StackView的使用似乎很奇怪,因为它看起来不像你堆叠任何东西。提到的SwipeView还试图通过只加载最多三页来保持低内存消耗,以实现平滑过渡。你的StackView不是这样 - 对象是在开始时创建的,永远保持活动状态,只有父母身份由StackView控制
标签: javascript qt qml qtquick2 qt5.6