实例化没有Loader的内联组件

时间:2017-08-24 07:54:03

标签: qt qml qtquick2

有没有一种方法可以在不使用Component的情况下实例化内联Loader(即在同一文件中定义)?我不太关心使用Loader对性能的影响,因为我在使用大量Loader包装器来污染我的文件。

2 个答案:

答案 0 :(得分:4)

我发现Dynamic QML Object Creation from JavaScript页面可能会产生误导。

没有提及使用声明性创建的Component或使用模型。它在大多数情况下仅提到Qt.createComponentQt.createQmlObject,这些都是不必要的(并且依赖于字符串)。

我建议使用带Component的内联createObject()代替更易读和可维护的代码。像这样:

Rectangle {
    id: appWindow
    width: 300; height: 300

    Component {
        id: redRectComponent
        Rectangle {
            color: "red"
            width: 20
            height: 20
        }
    }

    Component.onCompleted: {
        var newObject = redRectComponent.createObject(appWindow);
    }
}

如果我想要强制创建临时对象,例如弹出窗口,我会使用此方法。

如果我要创建其中的几个对象,我很可能会使用ListModel / ListView / Repeater / ... Instantiator像这样:

ListModel {
    id: rectModel
}

Column {
    Repeater {
        model: rectModel
        Rectangle {
            color: model.rectColor
            width: 20
            height: 20
        }
    }
}

Button {
    onClicked: rectModel.append({rectColor: "red"})
}

在这里,我甚至不必处理对象创建,我只是在ListModel中插入一些数据,而Repeater负责代理的实例化。

答案 1 :(得分:2)

您可以使用Repeater创建没有Loader的组件。 或者你甚至可以使用Qt.createComponent来做到这一点。

查看有关Dynamic Component Creation in QML

的Qt文档

有关Repeater的信息和示例here

您甚至可以动态地从字符串创建组件:

Rectangle {
    id: appWindow
    width: 300; height: 300

    Component.onCompleted: {
      var newObject = Qt.createQmlObject('import QtQuick 2.0; Rectangle {color: "red"; width: 20; height: 20}',
                                       appWindow,
                                       "dynamicSnippet1");
    }
}