在QML中动态改变组件布局

时间:2017-03-11 10:01:53

标签: qt qml

在按钮点击等事件上重新排列QML UI组件的首选(推荐)方法是什么?

我确实设计了一个由一堆自定义组件组成的UI,每个组件都绑定到(C ++)模型。我使用锚点来定位ApplicationWindow中的组件。 单击按钮,我想添加一个额外的组件,由于其大小,需要重新排列现有组件。实际上,按钮可以理解为切换到不同的模式,例如IDE中的Debug视图(想想Eclipse)。 我的目标是在视图之间保持组件的一致状态,并使交换机尽可能流畅。

我能想到这些选择:

  1. 设计两个不同的视图,并使用Loader或State在它们之间切换。由于初始化模型需要一些时间,因此在切换期间不应删除它们。我认为,将它们设置为QMLApplicationEngine的ContextProperty应该照顾它。

  2. 在onClicked() - 按钮的处理程序中进行大量重新排列。可能是最糟糕的解决方案,但不需要重新初始化组件和模型。

  3. 我认为最优雅的解决方案是在某种容器(或模型)中初始化组件,然后在按钮单击时为该容器分配不同的布局。但我不知道,如果这是可能的,以及如何实现这一目标。

  4. 编辑:我使用StackLayout执行了第1步。它基本上工作,但似乎隐形UI仍然在后台运行并消耗资源(例如从我的QQuickImageProvider请求图像)。 使用Loader消除了这个问题,因为它会在源属性的每次更改时销毁先前的UI。然而,我对StackLayout的喜欢是它在app启动时预加载所有UI。因此,与Loader相比,过渡更平滑。 有没有办法禁用不可见的用户界面?

1 个答案:

答案 0 :(得分:0)

您的选项(1)是最灵活的选项,因为根据状态,您有两个完全独立的UI。

正如您已经发现的那样,这需要以两种UI都可访问的方式保留所有相关的状态数据,例如:在C ++或全局可访问的QML / Script对象中。

如果您想要进行任何更改或调整而不仅仅是重新排列元素,我会继续这样做。

如果您确定重新排列元素就足够了,请查看QML states

这有点像你的选项(2)和(3)的组合。

状态设置允许您在本地为每个元素定义anchors和其他属性,具体取决于命名状态。

按钮的信号处理程序只需要通过将其中一个名称分配给相应的state属性来更改哪些状态处于活动状态。