给QML QSharedPointer <t>或std :: unique_ptr <t>?

时间:2018-10-12 14:10:05

标签: c++ qt qml ownership

根据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 ++。

0 个答案:

没有答案
相关问题