在没有 Loader 的情况下实例化内联组件
Instantiate inline Component without Loader
有没有办法在不使用 Loader
的情况下实例化内联 Component
(即在同一文件中定义)?我不太关心使用 Loader
s 对性能的影响,因为我担心用大量 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.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
负责委托的实例化。
有没有办法在不使用 Loader
的情况下实例化内联 Component
(即在同一文件中定义)?我不太关心使用 Loader
s 对性能的影响,因为我担心用大量 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.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
负责委托的实例化。