3

ご存知のように、Q_OBJECTs はインスタンスであり、コピーできません。

QObject任意の派生クラスのすべての静的および動的プロパティをコピーするための構文シュガーはありますか?

それは非常に簡単に思えますが、そのような参照が見つかりません-明らかに自分で実装するのは非常に簡単なはずです- loop over metaObject()、 loop over 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 に答える