gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:04:04 24 4
gpt4 key购买 nike

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

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

这看起来很简单,但我找不到任何引用 - 显然自己实现一个应该很简单 - 遍历 metaObject(),遍历 dynamicPropertyNames() ,相应地设置。

最佳答案

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

/** 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,因为很难定义如何完成此操作的规则,并且这些规则仅适用于某些用例,而在其他用例中您需要其他规则...

关于qt - Q_OBJECT "copying"- 复制所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12664758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com