根据the docs,“当数据从C ++传输到QML时,数据的所有权始终由C ++保留。该规则的例外是从显式C ++返回QObject
时方法调用:在这种情况下,除非通过指定QQmlEngine::setObjectOwnership()
调用QQmlEngine::CppOwnership
显式将对象的所有权设置为保留在C ++中,否则QML引擎将假定该对象的所有权。”
作为C ++程序员,每当我看到函数返回原始指针时,我都会发抖。当您可以返回Foo*
或至少一个std::unique_ptr<Foo>
或std::shared_ptr<Foo>
时,为什么还要返回一个QSharedPointer<Foo>
?似乎没有内置此功能。显然,应允许QML使用std::unique_ptr<Foo>
。确实不支持使用QSharedPointer<Foo>
吗?有一些解决方法吗?
也许是这样(受http://doc.qt.io/qt-5/qtqml-cppintegration-data.html#value-types的启发)?
template <typename T>
class QSharedNotNullPointerWrapper {
{
Q_GADGET
Q_PROPERTY(T& value READ value WRITE setValue)
public:
QSharedNotNullPointerWrapper(const QSharedPointer<T>& ptr)
: m_ptr(ptr) {
Q_ASSERT(m_ptr); // Not-null
}
operator QSharedPointer<T>&() { return m_ptr; }
const T& value() const { return *m_ptr; }
T& value() { return *m_ptr; }
void setValue(const T &val) { *m_ptr = val; }
private:
QSharedPointer<T> m_ptr;
};
#define DECLARE_SHARED_PINTER_METATYPE(NAME, T) \
using NAME = QSharedNotNullPointerWrapper<T>; \
Q_DECLARE_METATYPE(NAME)
如果类似的方法可行,那么我可以做到
DECLARE_SHARED_PINTER_METATYPE(MyFooPtr, Foo)
然后让函数返回MyFooPtr
并将其安全地交给QML或C ++。