将 QObject 指针从 QML 对象传递到C++
Passing QObject pointer from a QML object to C++
我在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"]
)。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象