QT在StackView中安排组件

QT arranging Components in the StackView

本文关键字:组件 StackView QT      更新时间:2023-10-16

我们正在开发QT Cross Platform应用程序。应用程序具有许多功能屏幕和导航。为了简单地处理屏幕,我们正在使用QT QML StackView。将每个项目推到StackView都是页面。我正在使用以下功能推出和弹出屏幕。

stackview.push(someurl); //push new url
stackview.pop(); //pop current URL or page

我的问题是,我们如何重复使用组件/页面已经推入堆栈?

示例:我有以下屏幕A,B,C,D。Stack看起来像A-> B-> c-> d。现在,从屏幕D中,我想导航到屏幕A。由于应用程序的统一体系结构,我不想执行3次pop(),而是应用程序应该重复使用已经按下屏幕A并将其提升到顶部。

我们可以简单地将屏幕a推到 StackView(a-> b-> c-> d-> a),但是我们将不同的信号/插槽连接到/从每个屏幕连接,这不是连接的好习惯每次屏幕都被推开,也不想增加应用程序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 

可以基于索引的LAOD StackView组件,我在文档中找不到任何与之相关的内容。

由于应用程序的统一体系结构,我不想进行3次pop(),而应重复使用已按下屏幕A并将其最高。

您不必三次致电POP()才能返回A。根据documentation

项目pop(item item =不确定) [...]

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

仅致电pop(null)一次将您的堆栈推到第一个推动。

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

StackLayout {
    id: layout
    Screen1 {}
    Screen2 {}
    Screen3 {}
    Screen4 {}
}

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