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

时间:2011-11-25 08:36:24

标签: qt qt4 qml

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

使用内置的qml对象(如Image:

)时可以正常工作
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中静态使用我的自定义目标类型,一切正常。这是一个已知的限制,任何解决方法吗?

2 个答案:

答案 0 :(得分:4)

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

Component {
    id: targetFactory
    Target {}
}

var newTarget = targetFactory.createObject(parent, properties)

但是如果你想坚持Qt.createQmlObject调用,我猜你有一个不同的目录中的Target组件,你只是错过了一些import语句。字符串参数必须是QML文件的内容,该文件在与调用它的目录相同的目录中独立工作。

E.g。

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

BTW:不推荐使用Qt 4.7导入,因为它们不允许使用其他版本的QtQuick。

答案 1 :(得分:1)

来自the docs

  

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

我理解这意味着createQmlObject只有在运行时定义了项类型并且应用程序因此知道它的存在时才会起作用。

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