【问题标题】:Is it safe to bind to C++ subobject's property in QML?在 QML 中绑定到 C++ 子对象的属性是否安全?
【发布时间】: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}

【问题讨论】:

  • databasePointcppProp 的生命周期是多久,谁拥有所有权?
  • @Amfasis - 数据库和 databasePoint 拥有 C++ 所有权。它们永远不会被删除。数据库是在应用程序启动时创建的。 databasePoint 是在第一次调用 getDbpointObject() 时创建的。进一步调用 getDbpointObject() 只需返回指向 databasePoint 的指针。
  • 那么它确实是安全的,也回答了。两个旁注,你可以使用property DBPoint qmlCompProp,因为你已经注册了类型,我假设你想要qmlRegisterUncreatableType
  • 链接到 Qt 论坛上发布的同一查询:forum.qt.io/topic/132623/…

标签: c++ qt qml


【解决方案1】:

是的,理论上应该是安全的。在对象存在之前绑定不会发生,并且直到Component.onCompleted() 退出之后才会存在。该值将被解析,除非您破坏它,否则绑定将保持不变,并且属性的顺序无关紧要。

【讨论】:

    【解决方案2】:

    来自 Qt 支持的回复:

    在 binding.qml 中,QML 属性 bindProp 被绑定到 myQmlComp.qmlCompProp.cppProp 这个绑定安全吗?

    看起来像。

    绑定总是会被解决吗?

    假设没有参考问题,是的

    databasePoint c++ 对象在 Component.onCompleted 中分配给 qmlCompProp。在那之前,qmlCompProp 是一个空对象。会影响绑定分辨率吗?

    这种情况应该可行。但是,绑定最初是为 在这种情况下为空对象(取决于这一切是如何实例化的) 然后在 onCompleted 之后,它会更新要引用的绑定 那个真正的 cppProp (而不是它为空创建的虚拟 对象)。

    binding.qml 中属性求值的顺序会影响绑定解析吗?

    至少在这种情况下不会。如果您有其他问题,您可能会遇到一些问题 绑定的依赖属性,就像你有一个数组 between 和它的索引是另一个属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2018-07-24
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      相关资源
      最近更新 更多