如何加载相同的 QML 文件并传递不同的属性

Posted

技术标签:

【中文标题】如何加载相同的 QML 文件并传递不同的属性【英文标题】:How to load the same QML file and pass them different properties 【发布时间】:2019-04-17 12:16:49 【问题描述】:

我有一个 index.qml 文件,它由两个以 3:1 的比例填充屏幕的矩形组成。在他们两个中,我都加载了相同的 window.qml 文件。我需要为属性 ORIENT 分配不同的值,因此 window.qml 的行为会有所不同。

看下面的例子。这个 ORINET 只是为了展示我想要达到的目标......

index.qml

Rectangle 
    id: rootA
    anchors.left: parent.left
    anchors.top: parent.top
    width: parent.width * 0.65

    // set some property or function so it will be seen in loaded window.qml
    // sth like:
    property ORINET: "horizontal"

    Loader 
        anchors.left: parent.left; anchors.top: parent.top;
        anchors.right: parent.right; anchors.bottom: parent.bottom
        source: "window.qml"
    


Rectangle 
    id: rootB
    anchors.right: parent.right
    anchors.top: parent.top
    width: parent.width * 0.35

    // set some property or function so it will be seen in loaded window.qml
    // sth like:
    property ORINET: "vertical"

    Loader 
        anchors.left: parent.left; anchors.top: parent.top;
        anchors.right: parent.right; anchors.bottom: parent.bottom
        source: "window.qml"
    

window.qml

Rectangle 
    id: windowBox
    state [
        ...
    ]
    ...
    Component.onCompleted: 
        windowBox.state = ORINET
    

【问题讨论】:

【参考方案1】:

根据这个documentation,您可以为Loader 提供一个属性,该属性也可用于加载的项目:

Loader 
    anchors.fill: parent
    property int ORINET: "vertical
    source: "window.qml"

window.qml:

Rectangle 

    states: [
        ...
    ]
    state: ORINET

请注意,在 QtCreator 中,state: ORINET 可能看起来像斜体和蓝色,就好像它不存在一样,但这只是编辑器

【讨论】:

我没有根据您的示例进行定制,因为我不完全了解您打算如何使用状态,是不是 QML 状态机制? @pi.314 我编辑了我的答案以更多地反映您的情况。另请注意,您可以只做anchors.fill: parent,而不是单独做所有四个边;-)

以上是关于如何加载相同的 QML 文件并传递不同的属性的主要内容,如果未能解决你的问题,请参考以下文章

角度 5 中具有相同 URL 的两个不同组件(通过延迟加载在路由器中传递 slug)

Qt/QML - 如何对 DelegateChooser 中的所有 DelegateChioces 应用相同的背景?

如何在一个 qt qml 窗口中运行和显示 4 个可执行文件?

qml 对多个对象使用相同的矩形组件

QML Loader 使用注意事项

在 C++ 中循环读取 QML 对象(CheckBox)属性:总是相同的值