2011-11-29 25 views
1

我有一個日誌界面,允許用戶對Logger進行子類化並覆蓋log()虛擬功能,以便用戶可以創建自己的記錄器。有一位經理跟蹤所有註冊的日誌記錄方法(即控制檯,系統日誌,Widget等)如何防止在QT中的deleteChildren()過程中刪除子項?

我創建了一個顯示日誌的QListWidget Logger。不幸的是,它由日誌記錄管理器擁有,因爲它是一個QObject,它也是MainWindow的子節點。這會導致兩個對象試圖在應用程序關閉時將其刪除。

第一次圍繞QObjects->deleteChildren()被調用並刪除它。然後Loggin gmanager再次嘗試和CRASH。

如何防止在deleteChildren()期間銷燬特定的QObject?這是一個壞主意嗎?

回答

4

你不能排除一個孩子從刪除,如果你可以,這是一個壞主意。在QObject層次結構中,子級由父級擁有。這是親子關係的主要目的之一。我不明白爲什麼你應該想要一個沒有刪除的親子關係。

可能性:

  1. 讓它日誌管理器的孩子
  2. 不要給它一個家長都讓日誌管理器中刪除它
  3. 不要給它一個家長在所有並使用QSharedPointer/std :: shared_ptr(後者在C++ 11中),通過使用QSharedPointer實例int mainwindow和logger來管理它。

不知道代碼,我會說主窗口不應該混淆記錄器,所以我會將所有權完全移到經理。另外,我沒有看到爲什麼通常的Logger接口應該從QObject繼承的原因,所以我會考慮徹底刪除該繼承(這留下了「僅由Logging manager擁有」和QSharedPointer選項)。

+0

我在嘗試推薦#3,因爲我認爲這可能是最好的選擇。雖然這是我第一次進入QSharedPointer,所以*手指交叉*。 – shadowland