将 QObject 指针从 QML 对象传递到C++

Passing QObject pointer from a QML object to C++

本文关键字:C++ 对象 QML QObject 指针      更新时间:2023-10-16

我在Qt/C++中有一个发布者/订阅者键值数据库类。订阅者可以通过传递密钥(字符串)、他们的QObject指针和属性来连接。 每当订阅密钥的值发生更改时,订阅的 QObject 的属性都会更改为新值。在Qt/C++中工作很好。

现在我想在 QML 中做一个视图。是否可以从 QML 传递到具有 3 个参数的对象C++:

  • QML 对象的 QObject 指针
  • 属性作为字符串
  • 数据库键作为字符串

更可取的解决方案是,就好像该属性连接到另一个属性一样:

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 的this-Keyword,但了解到它目前在 QML 中未定义:-(

只需给对象一个id并将该 id 传递给函数,它将成为C++端的QObject *。然后,您可以使用元系统按名称访问属性:

// qml
Item {
id: someitem
...
CppObj.cppFoo(someitem)
}
// c++
void cppFoo(QObject * obj) {
...obj->property("myDBKey")...
}

引用也可以,例如children[index].

你可以做的是一个函数,只把你的 dbkey 作为一个参数,并返回一个QObject*,用一个READ函数和NOTIFY信号来公开一个Q_PROPERTY

这样,您只需通过通知信号告诉值已更改,QML将自动调用读取函数。

它可以像那样实现Item{ myQmlProp: MyCppInst("myDBKey").value }.

如果您在编译时知道 db 键,则可以直接在MyCppInst中为每个密钥添加一个属性,或者如果您在创建 cpp 类时知道它们,则可以将它们放在QQmlPropertyMap中。 用法是这样的:Item { myQmlProp: MyCppInst.myDbKey }(如果需要在QML端动态,则MyCppInst["myDbKey"])。