33

我正在尝试创建一个 QML 对象,它就像其他对象的包装器一样。这是我的 QML 文件(Container.qml):

Item {
    property string label
    property Item control

    Row {
        Label {
            text: label
        }

        // Not sure how to display the control assigned to the control property
    }
}

我想做的(在我使用这个组件的 QML 中)是这样的:

Container {
    label: "My Label"
    control: Textbox {
        text: "My Value"
    }
}

当输入该 QML 时,结果(在界面中)应该类似于此 QML 的输出:

Item {
    Row {
        Label {
            text: "My Label"
        }
        Textbox {
            text: "My Value"
        }
    }
}

这可能吗?当我尝试这样做时,在将项目分配给控件属性时,我得到“无法将对象分配给属性”。我搜索了 Qt 论坛并无情地用谷歌搜索,但没有成功。如果有人知道答案,将不胜感激。

谢谢

杰克

4

4 回答 4

43

有更好的解决方案:

/* 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 {
             /* ... */
        }
    }
}

感谢用户bobbaluba建议使用该data属性而不是children.

于 2012-04-05T15:09:44.527 回答
36

您可以使用Loader元素动态加载项目,然后将 'control' 属性设置为直接引用加载器的sourceComponent属性的别名

所以你的 Container.qml 可能看起来像这样:

Item {
    property string label
    property alias control : loader.sourceComponent

    width: 200; height: 200

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

现在,当您将图形项分配给“控件”属性时,加载器将自动显示它。

于 2011-02-18T02:33:21.853 回答
2

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

Item
{
    id: root

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

请注意,矩形项的父项是手动设置的,因此它们将是容器的可视子项。

您可以将它们评估为 javascript 数组

for ( var i = 0; i < root.rectList.length; i++ )
{
   var rect = root.rectList[i];
   rect.visible = true;
}

或者

rect.rectList[1].visible = false;
于 2014-05-15T20:08:59.397 回答
1

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

最好的计划是找出控件(Textbox在您的示例中)可能是的所有可能事物,为您的行中的每个组件创建一个实例,并在您的Item. 然后,状态将负责使所需的组件在适当时可见或不可见。

编辑

只是觉得。(还没有尝试过,但试一试!)在您Item的处理程序中,尝试为您的对象Component.onCompleted:调用control.createObject(rowID)where rowIDis an (您希望成为 的父对象)。idRowcontrol

于 2011-02-17T07:58:31.897 回答