3

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

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

这似乎是一个明智的选择,但我找不到任何这样的参考 - 显然我自己实现一个应该很简单 - 循环metaObject(),循环dynamicPropertyNames(),相应地设置。

4

2 回答 2

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
};

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

class MyClass : public QObject, public QObjectCopyHelper<MyClass>
{
    Q_OBJECT
    ...
};

但是,这仍然需要clone()调用(丑陋的“Java 风格”)。所以我们可以额外定义一个复制构造函数来调用clone(),你也可以想到assign()在赋值运算符中调用的方法。

请注意,这实际上只复制了属性!QObject 中还有很多其他的东西被跟踪,比如当前的连接。他们明确禁止复制 QObjects,因为很难定义如何执行此操作的规则,并且这些规则仅适用于某些用例,而在其他用例中您需要其他规则......

于 2012-10-01T12:44:58.997 回答
2

这里讨论了一个解决方案,他们采用循环属性方法。这里似乎没有“语法糖”。

于 2012-09-30T21:31:08.457 回答