在没有 Loader 的情况下实例化内联组件

Instantiate inline Component without Loader

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

您可以使用 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");
    }
}

我发现 Dynamic QML Object Creation from JavaScript 页面可能具有误导性。

没有提及使用声明创建的 Component 或使用模型。它只提到 Qt.createComponentQt.createQmlObject 大多数时候是不必要的命令(并且依赖字符串)。

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

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

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

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

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

如果我要创建多个这样的对象,我很可能会使用 ListModelListView/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 负责委托的实例化。