Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在QML中动态更改组件排列_Qt_Qml - Fatal编程技术网

Qt 在QML中动态更改组件排列

Qt 在QML中动态更改组件排列,qt,qml,Qt,Qml,在事件(如按钮单击)上重新排列QML UI组件的首选(推荐)方法是什么 我确实设计了一个UI,它由一堆自定义组件组成,每个组件都绑定到一个(C++)模型。我使用锚点在ApplicationWindow中定位组件。 单击一个按钮,我想添加一个额外的组件,由于它的大小,需要重新排列现有的组件。实际上,按钮可以理解为切换到不同的模式,例如IDE中的调试视图(想想Eclipse)。 我的目标是使组件在视图之间保持一致的状态,并使切换尽可能流畅 我可以想到这些选择: 设计两个不同的视图,并使用加载程序或状

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

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

我可以想到这些选择:

  • 设计两个不同的视图,并使用加载程序或状态在它们之间切换。由于初始化模型需要一些时间,因此在切换过程中不应删除这些模型。我认为,将它们设置为QMLApplicationEngine的ContextProperty应该解决这个问题

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

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

  • 编辑:我遵循方法1。通过使用StackLayout。它基本上可以工作,但似乎不可见的UI仍在后台运行并消耗资源(例如,从我的QQuickImageProvider请求图像)。 使用加载器可以消除这个问题,因为它会在每次更改源属性时破坏以前的UI。然而,我喜欢StackLayout的地方在于它在应用程序启动时预加载所有UI。因此,与加载程序相比,转换更平滑有没有办法禁用不可见的UI?

    您的选项(1)是最灵活的选项,因为您有两个完全独立的UI,具体取决于状态

    正如您已经发现自己一样,这需要以一种既可以由UIS访问的方式来保持所有相关的状态数据,例如C++或全局可访问的QML/Script对象。 如果你想做更多的改变或调整,而不仅仅是重新排列元素,我会这么做

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

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

    状态设置允许您非常本地地根据命名状态定义每个元素的属性和其他属性


    然后,按钮的信号处理程序只需将其中一个名称指定给相应的
    state
    属性,即可更改哪个状态处于活动状态。

    谢谢!我听从了你的建议,选择了独立的UIs。对于如何实施这一点,您是否有一些建议?我更新了我原来的问题。