我在Qt / C ++中有一个发布者/订阅者键值DB类。订阅者可以通过传递密钥(字符串),他们的QObject指针和属性来连接。 只要订阅密钥的值发生更改,订阅的QObject的属性就会更改为新值。适用于Qt / C ++。
现在我想在QML中创建一个视图。是否可以从QML传递给具有3个参数的对象:
优选的解决方案是,好像该属性连接到另一个属性:
Item{ myQmlProp: MyCppInst("myDBKey") }
修改 目前有效的是这个解决方案:
Item{
id:myqmlitem
myQmlProp: MyCppInst("myDBKey","myQmlProp",myqmlitem)
}
或者像这样:
Item{
id:myqmlitem
Component.onCompleted:{
MyCppPublisher.subscribe("myDBKey1","myQmlProp1",myqmlitem)
MyCppPublisher.subscribe("myDBKey2","myQmlProp2",myqmlitem)
}
}
与首选解决方案相比,我必须明确传递连接属性名称和QML项目实例。但没关系,非常感谢答案! 我希望使用QML的此 -Keyword,但已经了解到,它目前在QML中尚未定义: - (
答案 0 :(得分:2)
只需给对象一个id
并将该id传递给该函数,它将成为C ++端的QObject *
。然后,您可以使用元系统按名称访问属性:
// qml
Item {
id: someitem
...
CppObj.cppFoo(someitem)
}
// c++
void cppFoo(QObject * obj) {
...obj->property("myDBKey")...
}
引用也可以,例如children[index]
。
答案 1 :(得分:0)
您可以做的是仅将您的dbkey作为参数的函数,并返回QObject*
公开Q_PROPERTY
READ
函数和NOTIFY
信号。< / p>
这样,您只需告知通知信号值已更改,QML将自动调用读取功能。
可以像Item{ myQmlProp: MyCppInst("myDBKey").value }
一样实施。
如果您在编译时知道数据库密钥,您可以直接在MyCppInst
中为每个数据库添加一个属性,或者如果您在创建cpp类时知道它们,则可以将它们放在{ {1}}。
用法如下:QQmlPropertyMap
(或Item { myQmlProp: MyCppInst.myDbKey }
如果您需要在QML方面保持动态。)