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

时间:2018-02-09 10:50:13

标签: c++ qt qml

我在Qt / C ++中有一个发布者/订阅者键值DB类。订阅者可以通过传递密钥(字符串),他们的QObject指针和属性来连接。 只要订阅密钥的值发生更改,订阅的QObject的属性就会更改为新值。适用于Qt / C ++。

现在我想在QML中创建一个视图。是否可以从QML传递给具有3个参数的对象:

  • QML对象的QObject指针
  • property as string
  • DB-key as string

优选的解决方案是,好像该属性连接到另一个属性:

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中尚未定义: - (

2 个答案:

答案 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方面保持动态。)