从QML调用C++时,可以通过指针将QObject返回给qml。在返回之前,我可以调用
QObject* qobj = m_sharedPtr.data(); // Pointer to member shared-ptr-managed object.
QQmlEngine::setObjectOwnership(qobj, QQmlEngine::CppOwnership);
return qobj;但是考虑到QML是垃圾收集的,如何安全地工作呢?我的心理模型是,QML将获取指针并将其保持在某个QML指针包装器中,该指针包装器最终将被GC'd。但是,在setObjectOwnership调用之后,QML可以访问*qobj的时间没有限制。(例如,也许在此之后的下一次QML->C++调用会导致m_sharedPtr超出范围。)这是否意味着只有当对象的生命周期本质上是无限的(例如,单例)时,才能安全地使用QQmlEngine::CppOwnership?我看不到任何替代方案,但在任何文档中都没有找到任何提到这个问题的地方。
发布于 2019-12-10 22:18:20
如果m_sharedPtr引用在C++中创建的数据,qobj无论如何都会有CppOwnership,你应该像处理任何其他C++智能指针一样处理它(也就是说,只要你真正需要它,就让它存在)。
如果它是用QML创建的,那么默认情况下会有JavaScriptOwnership。如果您随后将所有权转移到C++,并且它被销毁,那么在QML中将无法再访问它。
如果在一段不确定的时间内可以在QML中访问qobj很重要,但仍然是由C++管理的,那么您可以退回到使用原始指针并自己处理销毁(例如,通过连接到QML窗口的aboutToClose()信号)。
https://stackoverflow.com/questions/59267782
复制相似问题