众所周知,Q_OBJECT
是实例,不可复制。
是否有任何类型的语法糖来复制任意QObject
派生类的所有静态和动态属性?
这似乎是一个nobrainer,但我无法找到任何这样的参考 - 显然实现一个应该是非常微不足道的 - 循环metaObject()
,循环dynamicPropertyNames()
,相应地设置。
答案 0 :(得分: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,因为很难定义如何完成这些规则的规则,而这些规则对于某些用例来说是正确的,而在其他规则中你需要其他规则......
答案 1 :(得分:2)
讨论了一个解决方案here,它们采用循环优化方法。这里似乎没有“语法糖”。