2

Loggerユーザーが仮想関数をサブクラス化してオーバーライドできるようにするロギングインターフェイスがあるlog()ので、ユーザーは独自のロガーを作成できます。登録されているすべてのロギングメソッド(コンソール、syslog、ウィジェットなど)を追跡するマネージャーがあります。

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

初めてQObjects->deleteChildren()呼び出され、削除されます。次に、Loggingmanagerが再試行してクラッシュします。

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

4

1 に答える 1

6

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

可能性:

  1. ロギングマネージャーの子にします
  2. 親をまったく与えず、ロギングマネージャーに削除させます
  3. 親をまったく与えず、QSharedPointer / std :: shared_ptr(C ++ 11では後者)を使用し、メインウィンドウとロガーのQSharedPointerインスタンスを使用して管理します。

コードを知らなくても、メインウィンドウがロガーを台無しにすべきではないと思うので、所有権を完全にマネージャーに移します。

また、通常のLoggerインターフェイスがQObjectから継承する必要がある理由がまったくわからないため、その継承を完全に削除することを検討します(これにより、「Loggingmanagerのみが所有する」オプションとQSharedPointerオプションが残ります)。

于 2011-11-29T19:16:22.567 に答える