2

我们正在开发 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 属性并根据 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 组件,我在文档中没有找到任何相关的内容。

4

1 回答 1

3

由于应用程序的统一架构,我不想执行 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

于 2017-08-30T07:54:49.007 回答