【发布时间】:2022-01-12 16:10:06
【问题描述】:
C++:
数据库 c++ 对象作为上下文属性暴露给 QML。
数据库 C++ 对象有一个方法 getDbpointObject(),它返回指向 databasePoint C++ 对象的指针。
databasePoint C++ 对象有一个名为 cppProp 的属性。
main.cpp:
// expose database object to qml
database databaseObj;
engine.rootContext()->setContextProperty("database", (QObject*)&databaseObj);
// register databasePoint class
qmlRegisterType<databasePoint>("DBPoint", 1, 0, "DBPoint");
database.h:
databasePoint *database::getDbpointObject()
databasePoint.h:
Q_PROPERTY(QVariant cppProp READ cppProp WRITE setcppProp NOTIFY cppPropChanged)
QML:
qmlComp 是一个自定义的 QML 组件。
qmlComp 有一个名为 qmlCompProp 的 QML 属性。
qmlComp 创建完成后,databasePoint c++ 对象被分配给 qmlCompProp。
qmlComp.qml:
Item
{
property var qmlCompProp: ({}) // qml property
Component.onCompleted:
{
qmlCompProp = database.getDbpointObject() // qml property holds the databasePoint c++ object
}
}
问题:
在 binding.qml 中,QML 属性 bindProp 绑定到 myQmlComp.qmlCompProp.cppProp
这种绑定安全吗?
绑定总是会得到解决吗?
databasePoint c++ 对象在 Component.onCompleted 中分配给 qmlCompProp。在那之前,qmlCompProp 是一个空对象。会对绑定分辨率有影响吗?
binding.qml 中属性评估的顺序是否会影响绑定分辨率?
binding.qml:
property int bindProp: myQmlComp.qmlCompProp.cppProp // is this binding safe?
qmlComp{id: myQmlComp}
【问题讨论】:
-
databasePoint和cppProp的生命周期是多久,谁拥有所有权? -
@Amfasis - 数据库和 databasePoint 拥有 C++ 所有权。它们永远不会被删除。数据库是在应用程序启动时创建的。 databasePoint 是在第一次调用 getDbpointObject() 时创建的。进一步调用 getDbpointObject() 只需返回指向 databasePoint 的指针。
-
那么它确实是安全的,也回答了。两个旁注,你可以使用
property DBPoint qmlCompProp,因为你已经注册了类型,我假设你想要qmlRegisterUncreatableType -
链接到 Qt 论坛上发布的同一查询:forum.qt.io/topic/132623/…