2011-11-21 11 views
1

私はオブジェクトを動的に作成するメインウィンドウを持っているので、新しいスクリーンを作る前に、最初に最後のスクリーンからすべてのオブジェクトを削除しなければなりません。私はこれを使用していた、そしてそれは素晴らしい仕事をしていた:Qtウィンドウのすべての子を削除するには?

qDeleteAll(this->window->findChildren<QWidget*>()); 

をしかし、今、私はいくつかのQGraphicsViewQGraphicsSceneを持ってこの画面を持っている、と私は同様に彼らの親のメインウィンドウを作った、そして今私はクラッシュを得たときにIメインウィンドウのすべての子を削除しようとします。

私の質問は基本的にどのようにこのクラッシュを避けることができますか? GraphicsSceneGraphicsViewを含むメインウィンドウのすべての子を簡単かつ安全に削除するにはどうすればよいですか?

答えて

5

私はあなたのクラッシュが二重削除に起因していると思われます。

QObjectの親子関係は、親が削除されるとその子も削除されるようにします。ウィジェットとその子孫をすべて削除する場合は、親を削除するだけです。

あなたのケースでは、おそらく動的に作成されたすべてのウィジェットが何らかの種類のコンテナウィジェット/フレームに属していることを確認し、それを削除してからそれを再作成します。

+0

「子孫」を意味していますか?ただし、Qtウィジェットを削除する必要があるかどうかはわかりません。それらは参照カウントであるため、1つまたは複数を再利用する場合、それらを保持するコストはほとんどありません。 – casualcoder

+2

QObjectsは削除時に子を削除しますが、QObjectシステムには参照カウントが組み込まれていません。メモリが適切に管理されていることを確認することは、プログラマの判断に任されています。 – Chris

+0

これはうまくいきました。すべてのオブジェクトの親として使用するQWidgetを作成し、この新しいQWidgetの親ウィンドウをメインウィンドウにして、それを削除してすべてのオブジェクトを削除しました。 あなたはこのメモリの問題についてもっと話すことができますか?私は記憶がなくなることを保証するために何かをするべきですか?私のプログラムは組み込みシステムで動作しているので、メモリ管理は非常に重要です!どうも。 –

関連する問題