私のプロジェクトの 1 つで、QObject の親/子機能を利用してツリーを構築する QObject 派生オブジェクトのツリーがあります。
シグナルとスロットを利用し、Qt の保護されたポインターを使用し、親オブジェクトが削除されたときに子を削除することを期待しているため、これは非常に便利です。
ここまでは順調ですね。残念ながら、私のプロジェクトでは、子の順序を管理/変更する必要があります。QObject は、その子の順序を変更する手段を提供しません (例外: QWidget の raise() 関数 - ただし、この場合は役に立ちません)。だから今、私は子供たちの順序を制御する戦略を探しています。いくつかのアイデアがありましたが、それらの長所と短所についてはわかりません。
オプション A:カスタム ソート インデックス メンバー変数
int m_orderIndex
メンバー変数をソートキーとして使用し、sortedChildren()
このキーでソートされた QObjects のリストを返すメソッドを提供します。
- 既存のオブジェクト構造に簡単に実装できます。
QObject::children()
メソッドがオーバーライドされると問題があります - アイテムの順序が変更されたときにループ中に問題が発生し、デフォルトの実装よりもコストがかかります。- すべてのソートキーが等しいか、0/デフォルトの場合、QObject オブジェクトの順序にフォールバックする必要があります。
オプション B:子の冗長リスト
で子の冗長リストを維持し、QList
作成および破棄されたときに子を追加します。
- 追加/削除されたオブジェクトの高価な追跡が必要です。これは基本的に、2 番目の子/親の追跡と多くのシグナル/スロットにつながります。QObject はすでに内部的にこれをすべて行っているため、もう一度行うのは得策ではないかもしれません。また、子供の順序を変更するなどの単純なことに、多くの肥大化が追加されているように感じます.
- 子の QList は必要に応じて変更できるため、優れた柔軟性。
- 子が QList に複数回存在することを許可するか、またはまったく存在しないことを許可します (たとえそれがまだ QObject の子である場合でも)。
オプション C: ...?
特に自分のプロジェクトでこれをすでに解決した人からのアイデアやフィードバックは大歓迎です。明けましておめでとう!