使用 Qt.createQmlObject() 创建自定义 qml 对象实例

Posted

技术标签:

【中文标题】使用 Qt.createQmlObject() 创建自定义 qml 对象实例【英文标题】:Creating custom qml objects instances with Qt.createQmlObject() 【发布时间】:2011-11-25 08:36:24 【问题描述】:

我有一个名为 Target.qml 的自定义 QML 对象。我想使用Qt.createQmlObject() 创建这个对象的动态实例。

它在使用像 Image 这样的内置 qml 对象时有效:

var newTarget = Qt.createQmlObject('import Qt 4.7; Image source: "widgets/SlideSwitchImages/knob.png"; ', parent);

但在使用任何自定义对象类型时失败,例如:

var newTarget = Qt.createQmlObject('import Qt 4.7; Target ', parent);

但是,如果我在 QML 中静态使用我的自定义 Target 类型,那么一切正常。这是一个已知的限制,有什么解决方法吗?

【问题讨论】:

【参考方案1】:

如果您只需要任意数量的 Target 实例,最好使用 Component。

Component 
    id: targetFactory
    Target 


var newTarget = targetFactory.createObject(parent, properties)

但是,如果您想坚持使用 Qt.createQmlObject 调用,我猜您的 Target 组件位于不同的目录中,而您只是错过了一些导入语句。字符串参数必须是 QML 文件的内容,该文件在与调用它的目录相同的目录中独立运行。

例如

var newTarget = Qt.createQmlObject('import QtQuick 1.0; import "../Targets"; Target ', parent);

顺便说一句:Qt 4.7 导入已被弃用,因为它们不允许 QtQuick 的其他版本。

【讨论】:

您好,感谢组件厂的建议,下次我会用到。我确实错过了我的 qml 字符串中的 import 语句。似乎 createQmlObject 有它自己的范围。【参考方案2】:

来自the docs:

有两种方法可以从 javascript 动态创建对象。您可以调用 Qt.createComponent() 来动态创建 Component 对象,或者使用 Qt.createQmlObject() 从 QML 字符串创建项目。 如果您在 .qml 文件中定义了现有组件,则创建组件会更好,并且您希望动态创建该组件的实例。否则,当项目 QML 本身在运行时生成时,从 QML 字符串创建项目很有用。

我理解这意味着createQmlObject 仅在您在运行时定义了项目类型并且应用程序因此知道它的存在时才能工作。

createComponent 似乎执行相同的功能,但对于 .qml 文件中预定义的项目类型,如您的情况。

【讨论】:

您好,感谢您的回答。我已经在运行时定义了该类型,并且可以像其他类型一样在静态 qml 中使用它,但是 createQmlObject 方法似乎有它自己的范围,因此需要它们自己的导入语句作为字符串的一部分。

以上是关于使用 Qt.createQmlObject() 创建自定义 qml 对象实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中动态创建 Popup

qml 绘制高精地图之怀疑人生的加载速度

Swift - 使用 UITableViewController 创建子菜单

使用多线程异步创建一组文件

使用 RestKit 创建子对象

使用 DDD 创建子实体的正确方法