2016-02-02 25 views
1

我有安裝一個像這樣的事件過濾器對象:如何使相應的QObject被刪除時刪除自身的事件過濾器?

someQObject.installEventFilter(new MyEventFilterObject()); 

我需要確保當someQObject被刪除了MyEventFilterObject分配的內存被釋放。 QObject在被刪除時發出任何事件嗎?或者我怎麼知道它已被刪除並刪除事件過濾器?

+0

難道你不能只有一些QObject作爲MyEventFilterObject的父對象嗎? – user2672165

+0

而這會導致自動刪除?因爲我確定可以,但我認爲層次結構只適用於小部件。 –

+0

父QObject的析構函數銷燬所有子對象。 – user2672165

回答

2

我以爲層次只適用於小部件。

對象所有權由QObject執行。 QWidget只是繼承自QObject。其實QWidget有點特殊:它可以有QObject的孩子,但是can't have a parent that's not a QWidget

所有你需要做的是父它安裝在過濾對象:

someQObject.installEventFilter(new MyEventFilterObject(someQObject)); 

確實的QObject發出任何事件時,它刪除了?

很難談論發射事件的對象。事件是針對在特定的接收器。事件的發件人必須先知道收件人。事件可以隨時發送給任何對象,通過任何代碼 - 甚至是在非Qt線程中運行的代碼,並且不使用Qt功能的任何其他方面。如果是通用的QObject,它可以將事件發送給其父母和/或其子女,這就是它。否則,它不知道任何其他對象。

QObject確實發出了一個信號從它的destuctor,雖然:QObject::destroyed(QObject*)。當信號發射時,您可以讓事件過濾器自行銷燬:

QObject * chainDestroy(QObject * src, QObject * dst) { 
    QObject::connect(src, &QObject::destroyed, dst, &QObject::deleteLater); 
    return dst; 
} 
auto filter = chainDestroy(&someQObject, new MyEventFilterObject); 
someQObject.installEventFilter(filter); 

如果可以,只需在過濾器上設置父級。如果過濾器需要具有不同的父級,則按上述方式連接信號。

我怎麼能知道它被刪除,並刪除事件過濾器?

你可以簡單地讓事件過濾器成爲一個永久性的對象 - 每個線程只需要一個。一個事件篩選器可以安裝在任意數量的對象上,只要它們全部位於同一個線程中即可。你當然可以這樣做,除非事件過濾器是有狀態的,並且它的狀態是特定於它所過濾的對象的。