Qt.createComponent() 与现有导入类型

问题描述 投票:0回答:2

我正在尝试创建现有导入类型的组件。虽然这个任务看起来足够重要(比如创建在您自己安装的 QML 插件中找到的类型的组件时),但它似乎没有记录在案。例如,当尝试创建

MyObject
的组件时,解决方法是在应用程序中创建
MyObjectComponent.qml
文件,如下所示:

import MyPackage 1.0
MyObject{}

然后可以使用

Qt.createComponent("MyObjectComponent.qml")
创建该对象的组件,但此方法似乎多余。有没有更简洁的方法?我希望
Qt.createComponent("MyObject")
能够发挥作用,但事实并非如此。

javascript qt qml qtquick2
2个回答
0
投票

Qt.createComponent
被指定为将
URL
作为参数,而不是类型名称,所以不,无法使用
Qt.createComponent(Type)
。但我还是不明白,这样做有什么好处。

  • 它没有给你灵活性,因为没有 QML-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 中的函数,因此您也无法使用

Qt.createComponent
来完成此操作 - 特别是当它被指定为采用 URL 时。
如果您仍然觉得有必要,并且创建
Component
的任何其他方法似乎无法满足您的需求,请再次询问,并指定您尝试执行的操作以及您认为这样做的原因有必要这样做,我们可能会找到解决您真正问题的方法。


0
投票

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
 相同的方式使用它。
是的..它仍然不允许在运行时直接传递组件名称。

© www.soinside.com 2019 - 2024. All rights reserved.