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.onCompleted
和 Component.onDestruction
。前者发生在启动时,后者发生在应用程序关闭时,而不是页面 pushed 或 popped 时。因此内存消耗一直高。防止这种情况的唯一方法是动态创建它们。
Edit 正如 BaCaRoZzo 指出的那样,在使用 StackView
时保持低内存很重要。可以做到,例如通过传递 Component
而不是静态创建的 Item
。在这种情况下,StackView
负责创建,对象一旦从堆栈中弹出就被销毁。
folibis 提到的 SwipeView
让事情变得更容易一些。由于它的 default property 是 Component
类型,所以你写 SwipeView { ... here ...}
的任何东西都不会立即实例化,而是存储为 Component 仅在需要时实例化。这是在显示或可能很快显示时(在 currentItem 的左侧或右侧)。所以我们可以看到,从内存消耗的角度来看,两个...View
都可以得到有效利用。虽然用法有不同的风格,SwipeView
和 StackView
的语义不同。通常 SwipeView
看起来更自然,当有多个页面 并行 而 StackView
是要走的路,当你完全按照它的名字建议做的时候:堆叠物品
谈到要走的路时:为什么选择 Qt.labs.controls
而不是 QtQuick.Controls 2.0
?与 labs
版本相比,它们往往更稳定,并且行为应该不太可能因其他版本而改变。
现在,我希望我能帮到你一些事情,尽管我可能没有解决你的问题,因为你还没有在你的问题中说明。
如何根据以下示例正确切换页面:
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.onCompleted
和 Component.onDestruction
。前者发生在启动时,后者发生在应用程序关闭时,而不是页面 pushed 或 popped 时。因此内存消耗一直高。防止这种情况的唯一方法是动态创建它们。
Edit 正如 BaCaRoZzo 指出的那样,在使用 StackView
时保持低内存很重要。可以做到,例如通过传递 Component
而不是静态创建的 Item
。在这种情况下,StackView
负责创建,对象一旦从堆栈中弹出就被销毁。
folibis 提到的 SwipeView
让事情变得更容易一些。由于它的 default property 是 Component
类型,所以你写 SwipeView { ... here ...}
的任何东西都不会立即实例化,而是存储为 Component 仅在需要时实例化。这是在显示或可能很快显示时(在 currentItem 的左侧或右侧)。所以我们可以看到,从内存消耗的角度来看,两个...View
都可以得到有效利用。虽然用法有不同的风格,SwipeView
和 StackView
的语义不同。通常 SwipeView
看起来更自然,当有多个页面 并行 而 StackView
是要走的路,当你完全按照它的名字建议做的时候:堆叠物品
谈到要走的路时:为什么选择 Qt.labs.controls
而不是 QtQuick.Controls 2.0
?与 labs
版本相比,它们往往更稳定,并且行为应该不太可能因其他版本而改变。
现在,我希望我能帮到你一些事情,尽管我可能没有解决你的问题,因为你还没有在你的问题中说明。