首页 文章

在QML中动态改变组件布局

提问于
浏览
0

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

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

我能想到这些选择:

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

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

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

Edit: 我通过使用StackLayout遵循方法1.它基本上起作用,但似乎隐形UI仍在后台运行并消耗资源(例如从我的QQuickImageProvider请求图像) . 使用Loader消除了这个问题,因为它会在源属性的每次更改时销毁先前的UI . 然而,我对StackLayout的喜欢是它在app启动时预加载所有UI . 因此,与Loader相比,过渡更平滑 . Is there a way to disable the invisible UIs?

1 回答

  • 0

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

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

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

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

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

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

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

相关问题