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 组件,我在文档中没有找到任何相关的内容。

【问题讨论】:

A StackView 是一个堆栈,如果您想在较低层中找到某些东西,您总是将东西推到顶部并自己向下工作。如果您不想出现这种行为,则不应使用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 中排列组件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用QML StackView的status属性?

stackland怎么把堆叠的卡牌拆开

Stack View 导致 Swift 3.0 中带有图像的按钮离开屏幕

Qt Quick之StackView具体解释

stackview 动画 - 排列的子视图的折叠

Scrollview中的两个动态Stack View