2011-11-29 11 views
1

ユーザはLoggerをサブクラス化してlog()仮想関数を上書きできるため、ユーザは独自のロガーを作成できます。QtのdeleteChildren()中に子が削除されないようにするには?

ログを表示するQListWidget Loggerを作成しました。残念ながら、それはロギングマネージャーが所有しており、QObjectであるためMainWindowの子でもあります。この結果、アプリケーション終了時に2つのオブジェクトが削除しようとします。

初めてQObjects->deleteChildren()が呼び出され、それが削除されます。その後、Logginのgmanagerは再びクラッシュしようとします。

deleteChildren()の間に特定のQObjectが破壊されないようにするにはどうすればよいですか?それは悪い考えですか?

答えて

4

子供を削除から除外することはできません。可能であれば、それは悪い考えです。 QObject階層では、子は親によって所有されます。これは、親子関係の主な目的の1つです。私はあなたが削除なしで親子関係を望むべき理由を理解していません。

可能性:

  1. そのログマネージャ
  2. の子、それをすべての親を与え、ログマネージャが
  3. それを削除してはいけないが、それをで親を与えてはいけないしてくださいQSharedPointer/std :: shared_ptr(C++ 11では後者)を使用し、QSharedPointerインスタンスint mainwindowとloggerを使用して管理します。

コードを知らずにメインウィンドウがロガーを混乱させてはいけないと言いたいので、所有権を完全にマネージャーに移します。

また、通常のLoggerインターフェイスがQObjectから継承される理由はわかりません。そのため、継承を完全に削除することを検討したいと思います(「Logging Managerによってのみ所有」とQSharedPointerオプション)。

+0

私はそれがおそらく最良の賭けになると思うので、私は推薦#3を試しています。これはQSharedPointerへの私の最初の進出ですが、*指が交差しました*。 – shadowland

関連する問題