10

QGraphicsItemデストラクタのドキュメントによると、「アイテムを破棄する前に、QGraphicsSceneからアイテムを削除する方が効率的です。」

何故ですか?それがどのように違いを生むことができるか私は考えることができません。そして、それが違いを生んだ場合、QGraphicsItemデストラクタは単に次のように呼び出すべきではありません。

if (scene() != NULL)
    scene()->removeItem(this);

ソースを確認しましたが、Qtソースを理解するのに苦労することもありますが、そうではないようです。編集:jdiの回答のコメントを参照してください。

4

1 に答える 1

6

たぶん私はあなたとは異なってドキュメントを解釈しています(私はソースを見ていません):

QGraphicsItem ::〜QGraphicsItem()[virtual]
QGraphicsItemとそのすべての子を破棄します。このアイテムが現在シーンに関連付けられている場合、アイテムは削除される前にシーンから削除されます。
注:アイテムを破棄する前に、QGraphicsSceneからアイテムを削除する方が効率的です。

これは、より効率的であるため、破棄する前に最初にシーンから削除されることを意味します。しかし、ソースがこれが発生することをどこにも示していないと言うなら、ドキュメントは間違っているように思われますか?

アイテムを破棄する前に最初にアイテムを削除する方が効率的である理由を推測する必要がある場合(APIがデストラクタで実際にアイテムを削除するかどうかに関係なく)、トリガーと関係があると思います。インデックスを再作成するシーン。おそらく、シーンに残っているアイテムを削除することにより、子アイテムのカスケード削除により、シーンのインデックスが常に再作成されます。一方、最初にアイテムを削除すると、シーンを1回更新するだけで階層全体が効率的に引き出され、それ以上影響を与えることなく通常の削除を実行できますか?シーン内で削除されている間、他の子イベント/シグナルのカスケード効果がさらに存在する可能性があります。

「メモ」の背後にあるロジックは、QGraphicsItemをサブクラス化し、デストラクタをオーバーロードして、最初にシーンから削除する必要があることを覚えておく人に通知することだと思います。

于 2012-05-02T21:04:49.390 に答える