4

の興味深い親子システムを読んだ後QObject、Qt 開発者が従来のコンテナーの代わりにこれを使用することがどれほど一般的であるか疑問に思います。メモリの連続性が要件ではないと仮定すると、これはいくつかの興味深い機能を提供するようです。

たとえば、 を持ち、QObjectさまざまなタイプの子を与えてから、それらのタイプに基づいてすべての子を簡単に見つけることができます。これにより、QObject に、従来のコンテナーの必要な同種のコレクションとは対照的に、動的な異種コンテナーのような機能が与えられます。

またQObject、子のメモリも自然に管理できるので便利です。

これは、この機能の一般的な使用法ですか?

4

2 に答える 2

5

QObject::findChildrenオブジェクトを QList のような通常のコンテナーに格納するよりもはるかに遅くなる可能性があります。理由は次のとおりです。

  1. 毎回すべての子を繰り返し処理します。再帰的にも検索します (ただし、これは無効にすることができます)。
  2. 実行時の型チェックを実行します。
  3. 毎回新しい QList を構築します。結果として多くのオブジェクトが存在する場合、これは遅くてコストがかかる可能性があります。

を使用するだけであれば、上記のすべては不要ですQList<Type*> my_objects。また、この場合:

  1. コレクションに名前を付けることができます。QList<QPushButton*> panic_buttonsよりも明確ですfindChildren<QPushButton*>()
  2. 同じタイプのオブジェクトのコレクションを複数持つことができます。

異種コンテナを作成する場合は、 を使用できますQHash<any_type_identifier, QObject*>。それはより速くなります。

おそらく、findChildren アプローチの方が単純な場合もあります。ただし、多くのオブジェクトや複雑なクラスがある場合は、通常のコンテナーを使用することをお勧めします。問題なく QObject のメモリ管理を使用できます。

于 2013-10-07T01:27:14.183 に答える
1

@PavelStrakhovが述べているように、 QObject::findChildren を使用すると遅くなる可能性があります。ただし、私が使用する 1 つの方法は、QList にオブジェクトを格納することと、QObject の親階層を持つことを組み合わせることです。これは、次のようなことを行うことに基づいています: -

class BaseObject : public QObject
{
    Q_OBJECT

    public:

        static BaseObject* FindObject(unsigned int id); // find object by id

    private:
        unsigned int m_id;

        static unsigned int s_nextId; // next id for a new BaseObject
        static QList<QBaseObject*> s_objectsList; // list of all BaseObject-type instances
};

すべてのオブジェクトが、QObject ではなく BaseObject を継承するようになりました。新しいクラスが作成されると、BaseObject のコンストラクターがアイテムの ID を設定し、s_nextId をインクリメントして、最後にオブジェクトが s_objectsList に追加されます。オブジェクトの検索は、静的オブジェクト リストを検索するという単純な問題になりました。

これはあなたが開発しているアプリケーションの設計に合わないかもしれませんが、特に QGraphicsView / QGraphicsScene システムを使用している場合には、確かに役に立ちました。その場合、BaseObject は QGraphicsObject から派生します。

もちろん、多くの標準ウィジェットを使用している場合、それらすべてに対して新しいクラスを作成する必要はほとんどありませんが、一部の設計に適したオプションです。

于 2013-10-07T08:11:26.107 に答える