有没有一种方法可以在不使用Component
的情况下实例化内联Loader
(即在同一文件中定义)?我不太关心使用Loader
对性能的影响,因为我在使用大量Loader
包装器来污染我的文件。
答案 0 :(得分:4)
我发现Dynamic QML Object Creation from JavaScript页面可能会产生误导。
没有提及使用声明性创建的Component
或使用模型。它在大多数情况下仅提到Qt.createComponent
或Qt.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");
}
}