QT 在 StackView 中排列组件
Posted
技术标签:
【中文标题】QT 在 StackView 中排列组件【英文标题】:QT arranging Components in the StackView 【发布时间】:2017-08-30 07:29:19 【问题描述】:我们正在开发 QT 跨平台应用程序。应用程序有许多功能屏幕和导航。为了简化屏幕处理,我们使用 QT QML StackView。推送到StackView
的每个项目都是Page。我正在使用以下功能来推送和弹出屏幕。
stackview.push(someurl); //push new url
stackview.pop(); //pop current URL or page
我的问题是我们如何重用已经推送到堆栈的组件/页面?
示例: 我有以下屏幕 A、B、C、D。堆栈看起来像 A->B->C->D。现在从屏幕 D 我想导航到屏幕 A。由于应用程序的统一架构,我不想做 3 次pop()
,而是应用程序应该重用已经推送的屏幕 A 并将其置于顶部。
我们可以简单地将屏幕 A 推到StackView
(A->B->C->D->A),但是我们将不同的 Signal/Slot 连接到/来自每个屏幕,这不是一个好习惯每次推送屏幕时都要连接,也不希望增加应用程序StackView
的大小。
在这种情况下,最好的方法是什么?在这种情况下我可以使用任何其他 QT 组件/控件,以便我可以根据索引呈现页面?
我们尝试将组件提前创建为qml Property,并根据 URL 推送它。它在示例应用程序中非常有用。但在我们的应用程序中,QML 组件数据密切依赖于 C++ 数据(或运行时的一些计算)。如果我们提前创建组件,应用程序会导致崩溃。所以我们不愿意使用这种方法。
property Page page1: Screen1 //Screen1.qml
property Page page2: Screen2 //Screen2.qml
property Page page3: Screen3 //Screen3.qml
property Page page4: Screen4 //Screen4.qml
是否可以基于索引加载 Stackview 组件,我在文档中没有找到任何相关的内容。
【问题讨论】:
AStackView
是一个堆栈,如果您想在较低层中找到某些东西,您总是将东西推到顶部并自己向下工作。如果您不想出现这种行为,则不应使用StackView
。您可以轻松地为此构建自己的容器。你可以例如将创建的项目推送到 ObjectModel
并仅显示具有正确索引的项目。
首先,@derM 是正确的。如果要在加载的 Pages 之间切换,StackView 不是最佳选择。但是,如果应该加载和卸载页面,那就是。除了调用 pop() 三次或更多次,您可以简单地指定要弹出的项目作为 pop -> pop(ScreenA) 的所有项目(但不包括)项目将被弹出。
【参考方案1】:
由于应用程序的统一架构,我不想执行 3 次 pop(),而是应用程序应该重用已推送的屏幕 A 并将其置于顶部。
您不必调用 pop() 三次即可返回 A。根据documentation
:
项目弹出(项目项目=未定义) [...]
item:如果指定,所有下到(但不包括)item 的项目都将被弹出。 如果 item 为 null,则将弹出直到(但不包括)第一项的所有项。如果未指定,则仅弹出当前项。
只需调用一次pop(null)
即可让您的堆栈进入第一个推送的 A。
另一种可能的方法是使用StackLayout
,它允许您根据索引显示 QML 组件。
StackLayout
id: layout
Screen1
Screen2
Screen3
Screen4
然后您可以通过更改currentIndex
属性来选择显示哪个屏幕:layout.currentIndex = 1 // display Screen2
【讨论】:
以上是关于QT 在 StackView 中排列组件的主要内容,如果未能解决你的问题,请参考以下文章