Q_OBJECT"复制" - 复制所有属性

qdo*_*dot 3 qt properties

众所周知,Q_OBJECTs是实例,不可复制.

是否有任何类型的语法糖来复制任意QObject派生类的所有静态和动态属性?

它似乎是一个nobrainer,但我找不到任何这样的参考 - 显然实现一个我应该是非常微不足道的 - 循环metaObject(),循环dynamicPropertyNames(),相应地设置.

lee*_*mes 5

您可以按如下方式实现复制助手类.

/** Enable QObjects to be explicitly copyable by copying property values. */
template<class T>
class QObjectCopyHelper<T>
{
protected:
    explicit QObjectCopyHelper(T *client) : m_client(client) {}

public:
    T *clone(QObject *parent = 0) {
        T *copy = new T(parent);

        // loop over and copy properties from m_client to copy
        // (both from T::staticMetaObject and dynamic ones)

        return copy;
    }

private:
    T *m_client; // <-- I think we need this, but I might be wrong
};
Run Code Online (Sandbox Code Playgroud)

然后你可以在任何QObject子类中使用它,只需要做很少的工作:

class MyClass : public QObject, public QObjectCopyHelper<MyClass>
{
    Q_OBJECT
    ...
};
Run Code Online (Sandbox Code Playgroud)

但是,这仍然需要clone()调用(丑陋的"Java风格").因此,我们可以另外定义一个只是调用的复制构造函数clone(),您也可以考虑assign()在赋值运算符中调用的方法.

请注意,这只是复制属性!在QObject中跟踪了很多其他东西,比如当前的连接.他们明确禁止复制QObjects,因为很难定义如何完成这些规则的规则,而这些规则对于某些用例来说是正确的,而在其他规则中你需要其他规则......