在C ++模型中,我有一个名为QAbstractListModel
的{{1}}派生类,其中包含Cart
容器。
在QML中,我显示了一个对象列表。当用户点击其中任何一个时,它应该用C ++创建该对象并将其添加到QList<void*>
。它还将设置该对象的一些属性。
我的问题是我如何以最佳方式真正做到这一点?
以下是C ++单独使用的代码:
cart
以上在C ++世界中是直截了当的,但如果点击是在QML中,它会变得有些复杂。创建和传递有关对象的信息的最佳方法是什么?假设除了价格和类型之外,我们还有更多关于对象的属性。
对于我们创建的每种类型的对象,是否必须有相应的插槽功能?如果对象具有更复杂的属性,比如5个不同的属性,我们是否将所有5个属性传递给插槽函数或者有更好的方法?我们应该使用一些工厂设计模式来创建对象吗?
使用QML时我缺少的一个特殊功能是可以自由使用C ++创建的对象。例如,如果它都是C ++,我可以创建C ++对象,而不是设置它的所有属性,无论有多少属性,而不是简单地将对象添加到容器中。
但是使用QML,即使我掌握了有关该对象的所有信息,但我无法真正创建和配置该类,而是传递给C ++,因为它必须在C ++中创建,而不能返回它因此所有配置参数也必须传递给插槽功能!还有更好的办法吗?
答案 0 :(得分:1)
除非C ++对象恰好是QObject
派生类型,注册为QML的类型,否则不能直接执行。即使在QML中,您也需要一个组件或QML源包装器来创建C ++对象,例如:
\\Object.qml
import Object 1.0
Object {}
所以现在你有一个QML源包装器来动态创建C ++对象。或使用组件:
Component {
id: component
Object {}
}
但是,您可以使用QML调用C ++ slot
或Q_INVOKABLE
,并在那里创建对象。
您也可以在QML中设置对象属性,例如:
Object {
someProperty: someValue
}
或
component.createObject(parentObj, {"someProperty" : somevalue})
它将与构造函数类似地工作 - 所有属性都将在对象被运行时“竞争”之前设置。
从你的问题来看,你似乎已经领先于自己 - 在你急于使用QML之前多做一点学习......并且真的没有必要那些void *
- 这不是C. Don不要让你的生活更加艰难。