在按钮点击等事件上重新排列QML UI组件的首选(推荐)方法是什么?
我确实设计了一个由一堆自定义组件组成的UI,每个组件都绑定到(C ++)模型。我使用锚点来定位ApplicationWindow中的组件。 单击按钮,我想添加一个额外的组件,由于其大小,需要重新排列现有组件。实际上,按钮可以理解为切换到不同的模式,例如IDE中的Debug视图(想想Eclipse)。 我的目标是在视图之间保持组件的一致状态,并使交换机尽可能流畅。
我能想到这些选择:
设计两个不同的视图,并使用Loader或State在它们之间切换。由于初始化模型需要一些时间,因此在切换期间不应删除它们。我认为,将它们设置为QMLApplicationEngine的ContextProperty应该照顾它。
在onClicked() - 按钮的处理程序中进行大量重新排列。可能是最糟糕的解决方案,但不需要重新初始化组件和模型。
我认为最优雅的解决方案是在某种容器(或模型)中初始化组件,然后在按钮单击时为该容器分配不同的布局。但我不知道,如果这是可能的,以及如何实现这一目标。
编辑:我使用StackLayout执行了第1步。它基本上工作,但似乎隐形UI仍然在后台运行并消耗资源(例如从我的QQuickImageProvider请求图像)。 使用Loader消除了这个问题,因为它会在源属性的每次更改时销毁先前的UI。然而,我对StackLayout的喜欢是它在app启动时预加载所有UI。因此,与Loader相比,过渡更平滑。 有没有办法禁用不可见的用户界面?
答案 0 :(得分:0)
您的选项(1)是最灵活的选项,因为根据状态,您有两个完全独立的UI。
正如您已经发现的那样,这需要以两种UI都可访问的方式保留所有相关的状态数据,例如:在C ++或全局可访问的QML / Script对象中。
如果您想要进行任何更改或调整而不仅仅是重新排列元素,我会继续这样做。
如果您确定重新排列元素就足够了,请查看QML states
这有点像你的选项(2)和(3)的组合。
状态设置允许您在本地为每个元素定义anchors和其他属性,具体取决于命名状态。
按钮的信号处理程序只需要通过将其中一个名称分配给相应的state
属性来更改哪些状态处于活动状态。