Properties 如何将QML项分配给QML中的组件属性,然后在组件内使用该对象?

Properties 如何将QML项分配给QML中的组件属性,然后在组件内使用该对象?,properties,qml,Properties,Qml,我正在尝试创建一个QML对象,它的作用类似于其他对象的包装器。这是我的QML文件(Container.QML): 我想做的事情(在使用此组件的QML中)如下所示: Container { label: "My Label" control: Textbox { text: "My Value" } } Item { property string label property alias control : loader.sourceCo

我正在尝试创建一个QML对象,它的作用类似于其他对象的包装器。这是我的QML文件(Container.QML):

我想做的事情(在使用此组件的QML中)如下所示:

Container {
    label: "My Label"
    control: Textbox {
        text: "My Value"
    }
}
Item {
    property string label
    property alias control : loader.sourceComponent

    width: 200; height: 200

    Row {
        Label { text: label }
        Loader { id: loader }
    }
}
当输入该QML时,结果(在接口中)应类似于该QML的输出:

Item {
    Row {
        Label {
            text: "My Label"
        }
        Textbox {
            text: "My Value"
        }
    }
}
这可能吗?当我尝试执行此操作时,在将项分配给控件属性时,会得到“无法将对象分配给属性”。我搜索了Qt论坛,并用谷歌搜索了一下,但没有成功。如果有人知道答案,我们将不胜感激

谢谢


Jack已经使用QML大约一个月了,恐怕真的不知道该怎么做

最好的计划是找出控件(
Textbox
,在您的示例中)可能是的所有可能的东西,为行中的每个组件创建一个实例,并在
项上设置相应的状态。然后,州政府将酌情考虑使所需组件可见或不可见

编辑


只是想。(尚未尝试此操作,但尝试一下!)在
项的
组件中。完成后:
处理程序,尝试调用
控件。createObject(rowID)
,其中
rowID
对象的
id
(您希望成为
控件的父对象).

您可以使用元素动态加载项,然后将“control”属性设置为直接引用加载程序的sourceComponent属性的

因此,您的Container.qml可以如下所示:

Container {
    label: "My Label"
    control: Textbox {
        text: "My Value"
    }
}
Item {
    property string label
    property alias control : loader.sourceComponent

    width: 200; height: 200

    Row {
        Label { text: label }
        Loader { id: loader }
    }
}

现在,当您将图形项指定给“control”属性时,它将由加载程序自动显示。

有更好的解决方案:

/* MyObject.qml */

Rectangle {
    default property alias data /* name can be any */ : inner_space.data

    /* ... You can put other elements here ... */
    Item {
       id: inner_space

       /* ... Params ... */
    }
    /* ... You can put other elements here ... */
}
现在我们可以随心所欲了

/* main.qml */

Rectangle {
    MyObject {
        Button {
             /* ... */
        }
    }
}

感谢用户建议使用
数据
属性而不是
子项

,您可以使用自定义属性为其他项目创建容器:

Item
{
    id: root

    property list<Item> rectList: [
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        }
    ]
}

谢谢你的回复!这个解决方案(据我所知)是可行的,但并不理想。所有这些额外的隐藏控件只是为了呈现一个控件…看起来像是浪费。我会继续努力的。如果我发现了什么,我一定会发回的。这看起来肯定有用。我误解了动态创建对象的文档。你的简短解释为我澄清了这一点。我仍然收到
“无法将对象分配给属性”
错误。这没有道理,因为我认识你。例如,矩形接受渐变(我知道不是一个项目,而是一个对象)。我认为你的答案是正确的,我只是不明白为什么这行不通!:)谢谢你的帮助!如果你有更多的见解,让我知道!哇,那个加载器对象看起来很棒!但愿我早就知道了!这是一个更加优雅的解决方案。谢谢分享!这是否适用于非可视项,如TableViewColumn?这实际上是可行的-我从来没有想到我们可以在QML中使用“模板列表”-你在哪里找到的?这有记录吗???我记得没有具体记录。它源于javascript与QObject的设计和集成。不过,关于指定家长的具体情况,我必须通过反复试验来了解
rect.rectList[1].visible = false;