我正在尝试创建现有导入类型的组件。虽然这个任务看起来足够重要(比如创建在您自己安装的 QML 插件中找到的类型的组件时),但它似乎没有记录在案。例如,当尝试创建
MyObject
的组件时,解决方法是在应用程序中创建 MyObjectComponent.qml
文件,如下所示:
import MyPackage 1.0
MyObject{}
然后可以使用
Qt.createComponent("MyObjectComponent.qml")
创建该对象的组件,但此方法似乎多余。有没有更简洁的方法?我希望 Qt.createComponent("MyObject")
能够发挥作用,但事实并非如此。
Qt.createComponent
被指定为将 URL
作为参数,而不是类型名称,所以不,无法使用 Qt.createComponent(Type)
。但我还是不明白,这样做有什么好处。
Qt.createComponent(URL)
还使用引擎组件缓存。此外,只有少数用例使用
Qt.createComponent
显式创建 JS 组件是正确的方法,因为 QML 是一种声明式语言,大多数事情都可以通过声明式完成。
考虑以下创建组件的其他方法:
如果属性的类型是
Component
,则可以使用标准语法来创建对象。在 createComponent
步骤之后,对象创建会自动停止:
property Component someProperty: Item {
// This Item is not instantiated. Instead only a prototpye/component is created
// and bound to the property 'someProperty'
}
将您还不想完全创建的对象包装在
Component
:
Component {
id: myComponent // Use this to reference the Component later.
Item {
// This Item is not instantiated. Instead only a prototpye/component is created
// You can reference it by the *Component's id*
}
}
这也可以用于属性分配:
property var someProperty: Component {
Item {
}
}
TL;博士
不 - 您无法将类型传递给 QML 中的函数,因此您也无法使用来完成此操作 - 特别是当它被指定为采用 URL 时。Qt.createComponent
如果您仍然觉得有必要,并且创建的任何其他方法似乎无法满足您的需求,请再次询问,并指定您尝试执行的操作以及您认为这样做的原因有必要这样做,我们可能会找到解决您真正问题的方法。Component
derM 简要提到了解决方法,但对我来说还不够清楚。因此,经过一些搜索和尝试后,请参阅如何使用它的完整示例:
property var headers: [] //will be changed from outside
...
Component {
id: columnComponent
TableModelColumn{} //here put the QT type which you want to replicate
}
function generateColumns(headers) {
let columns = []
for (let item in headers) {
let column = columnComponent.createObject(tableModel, { display: headers[item]
});
columns.push( column )
}
return columns
}
TableModel {
id: tableModel
columns: generateColumns(headers)
}
一些解释:我正在建桌子。想要提高可重用性,并根据 header
变量中的条目数量和其中的字符串值创建列。通常可以使用
Repeater
来实现,但似乎
TableModel
不允许将一个而不是多个
TableModelColumn
直接传递给默认属性。因此不得不寻找解决方法。也许我的问题可以用更简单的方式解决,但似乎应该有助于理解 derM 的答案。就像总结一样:您需要创建
Component
并在其中包含您的类型,然后以与
createComponent
相同的方式使用它。 是的..它仍然不允许在运行时直接传递组件名称。