ご存知のように、Q_OBJECT
s はインスタンスであり、コピーできません。
QObject
任意の派生クラスのすべての静的および動的プロパティをコピーするための構文シュガーはありますか?
それは非常に簡単に思えますが、そのような参照が見つかりません-明らかに自分で実装するのは非常に簡単なはずです- loop over metaObject()
、 loop over dynamicPropertyNames()
、それに応じて設定します。
ご存知のように、Q_OBJECT
s はインスタンスであり、コピーできません。
QObject
任意の派生クラスのすべての静的および動的プロパティをコピーするための構文シュガーはありますか?
それは非常に簡単に思えますが、そのような参照が見つかりません-明らかに自分で実装するのは非常に簡単なはずです- loop over metaObject()
、 loop over 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 のコピーを明示的に禁止しています...
ここで解決策について説明します。ここでは、プロパティのループ アプローチを採用しています。ここには「構文糖衣」はないようです。