QT在StackView

时间:2017-08-30 07:29:20

标签: c++ qt qml stackview

我们正在开发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),但我们将不同的信号/插槽连接到每个屏幕和从每个屏幕连接每次按下屏幕时连接都不是好习惯,也不希望增加应用程序StackView的大小。

在这种情况下,最佳使用方法是什么?在这种情况下我可以使用的任何其他QT组件/控件,以便我可以根据索引呈现页面吗?

我们尝试提前创建组件qml Property并根据网址推送它。它在样本应用中非常有用。但在我们的应用程序中,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 个答案:

答案 0 :(得分:3)

  

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

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

  

项目弹出(项目项目=未定义)   [...]

     

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

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

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

StackLayout {
    id: layout

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

然后,您可以通过更改currentIndex属性来选择显示的屏幕:layout.currentIndex = 1 // display Screen2