2012-05-02 11 views
10

QGraphicsItem destructor documentationによれば、「アイテムを破壊する前にQGraphicsSceneからアイテムを削除する方が効率的です。」QGraphicsItemを破棄する前にシーンからQGraphicsItemを削除する方が効率的なのはなぜですか?

なぜですか?私はそれがどのように違いを生むか考えることはできません。私はソースをチェックし

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

、そして時々私はQtのソースを理解大変な時間を持っているが、これは、場合ではないようです。そして、違いを作るなかった場合、QGraphicsItemのデストラクタだけで呼び出すべきではありません。 EDIT:jdiの答えのコメントを参照してください。

答えて

6

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

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

私はそれがより効率的であるのでを破壊する前に、最初のシーンから削除されます意味することを取ります。しかし、ソースがこれが起こっている場所を示していないと言うなら、ドキュメントは間違っているようですか?

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

"ノート"の背後にあるロジックは、QGraphicsItemをサブクラス化し、シーンから最初に削除する必要性を念頭に置いてデストラクタをオーバーロードする人に知らせることです。

+1

ありがとうございます。私はソースをもう一度チェックし、シーンが存在するかどうかを確認する行があり、そうであれば、 'd_ptr-> scene-> d_func() - > removeItemHelper(this);'を呼び出します。私はそれがそうでなければならないと思う。あなたが正しいと思われるので、その音符はちょっと誤解を招くかもしれません(どちらか、それとも私はdoofusです)。 – Anthony

+0

@Anthony:私はちょうど誤解を招くように行くつもりです:-)。ドキュメントは参考になるように意図されていて、それがあなたにとって混乱している場合は、有効な観察となります。ソースを確認して確認するのがいい仕事です。 – jdi

関連する問題