从QML创建C ++对象

时间:2016-02-14 06:27:53

标签: c++ qt oop qml factory-pattern

在C ++模型中,我有一个名为QAbstractListModel的{​​{1}}派生类,其中包含Cart容器。

在QML中,我显示了一个对象列表。当用户点击其中任何一个时,它应该用C ++创建该对象并将其添加到QList<void*>。它还将设置该对象的一些属性。

我的问题是我如何以最佳方式真正做到这一点?

以下是C ++单独使用的代码:

cart

以上在C ++世界中是直截了当的,但如果点击是在QML中,它会变得有些复杂。创建和传递有关对象的信息的最佳方法是什么?假设除了价格和类型之外,我们还有更多关于对象的属性。

对于我们创建的每种类型的对象,是否必须有相应的插槽功能?如果对象具有更复杂的属性,比如5个不同的属性,我们是否将所有5个属性传递给插槽函数或者有更好的方法?我们应该使用一些工厂设计模式来创建对象吗?

使用QML时我缺少的一个特殊功能是可以自由使用C ++创建的对象。例如,如果它都是C ++,我可以创建C ++对象,而不是设置它的所有属性,无论有多少属性,而不是简单地将对象添加到容器中。

但是使用QML,即使我掌握了有关该对象的所有信息,但我无法真正创建和配置该类,而是传递给C ++,因为它必须在C ++中创建,而不能返回它因此所有配置参数也必须传递给插槽功能!还有更好的办法吗?

1 个答案:

答案 0 :(得分:1)

除非C ++对象恰好是QObject派生类型,注册为QML的类型,否则不能直接执行。即使在QML中,您也需要一个组件或QML源包装器来创建C ++对象,例如:

\\Object.qml
import Object 1.0
Object {}

所以现在你有一个QML源包装器来动态创建C ++对象。或使用组件:

Component {
    id: component
    Object {}
}

但是,您可以使用QML调用C ++ slotQ_INVOKABLE,并在那里创建对象。

您也可以在QML中设置对象属性,例如:

Object {
    someProperty: someValue
}

component.createObject(parentObj, {"someProperty" : somevalue})

它将与构造函数类似地工作 - 所有属性都将在对象被运行时“竞争”之前设置。

从你的问题来看,你似乎已经领先于自己 - 在你急于使用QML之前多做一点学习......并且真的没有必要那些void * - 这不是C. Don不要让你的生活更加艰难。