QML:根据状态仅显示某些组件

时间:2018-01-04 13:25:49

标签: qt qml

我有几个ui.qml个文件,比方说A.ui.qmlB.ui.qmlC.ui.qml

然后我必须根据State创建一个显示A + B,B + A或B + C等的窗口。

在我的main.qml中,我实际上写了以下内容:

...
Item {
    id: contentArea
    state: "state1"

    AForm {
        id: aForm
    }

    BForm {
        id: bForm
    }

    states: [
        State {
            name: "state1"
            PropertyChanges { target: aForm; x: 0 }
            PropertyChanges { target: bForm; x: 400 }
        },
        State {
            name: "state2"
            PropertyChanges { target: aForm; x: 400 }
            PropertyChanges { target: bForm; x: 0 }
        }            
    ]
...

因此,设置contentArea.state = "state2"时,交换A和B表单。

但这只是一个例子,看它是否有效。

现在我需要创建所有表单(我想使用Component)并仅在状态是某个时才显示它们。

怎么做?

1 个答案:

答案 0 :(得分:1)

您将AFormBForm替换为Loader,并将此source的{​​{1}} - 属性设置为正确的文件名,或者Loader右侧sourceComponent

Component id

只要状态发生变化,此过程就会销毁并重新创建Loader { id: topLoader } Loader { id: bottomLoader y: 200 } states: [ State { name: "state1" PropertyChanges { target: topLoader; source: "AForm.ui.qml" } PropertyChanges { target: bottomLoader; source: "BForm.ui.qml" } }, ... ] - 文件的实例。

您也可以使用例如a ui.qml ListViewsnapMode: ListView.SnapToItem,并在状态发生变化时更改interactive: false

您还可以创建所有对象,并且只将要显示的两个对象作为 frames 显示给currentItem,其余对象为Item的父级

或者您使用三个或四个null,其中只显示两个,您可以根据需要移动,只加载要显示的文件。在这里,您需要编写更多逻辑。