2017-08-30 73 views
2

我们正在开发QT跨平台应用程序。应用程序有许多功能屏幕和导航。为了简化处理屏幕,我们使用QT QML StackView。每个项目推到StackViewPage。我正在使用以下功能来推送和弹出屏幕。QT在StackView中排列组件

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),但是我们将不同的信号/插槽连接到每个屏幕或从每个屏幕连接不同的信号/插槽,并不是好的做法连接每次屏幕推送时,也不想长大应用程序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组件,我没有找到任何与文档相关的东西。

+1

一个'StackView'是一个堆栈,在堆栈上,你总是推ontop的东西,如果你想工作你自己下来在较低层找到一些东西。如果你不想有这种行为,你不应该使用'StackView'。您可以轻松地为此创建自己的容器。你可以例如将创建的项目推送到'ObjectModel'并仅显示具有正确索引的项目。 – derM

+1

首先,@derM有权利。如果你想在加载页面之间切换,StackView不是最好的选择。但是,如果页面应该被加载和卸载,它是。你可以简单地指定一个项目作为pop - > pop(ScreenA)的参数,而不是调用pop()三次或更多次,所有的项目都会弹出(但不包括)项目。 – Xplatforms

回答

3

由于应用程序的统一体系结构,我不想做3次pop(),而是应用程序应该重新使用已经推送的屏幕A并将其带到顶端。

您不必调用pop()三次回到A.根据documentation

项目POP(项项=未定义) [...]

项目:如果指定,所有项目将被弹出(但不包括)项目。 如果item为null,则会弹出所有项目(但不包括)第一个项目。如果未指定,则仅弹出当前项目。

只需拨打pop(null)一次让您的堆栈进入第一个A推送。

另一种可能的方法是使用StackLayout,它允许您显示基于索引的QML组件。

StackLayout { 
    id: layout 

    Screen1 {} 
    Screen2 {} 
    Screen3 {} 
    Screen4 {} 
} 

然后你可以选择屏幕通过改变currentIndex属性显示:layout.currentIndex = 1 // display Screen2