我有安裝一個像這樣的事件過濾器對象:如何使相應的QObject被刪除時刪除自身的事件過濾器?
someQObject.installEventFilter(new MyEventFilterObject());
我需要確保當someQObject
被刪除了MyEventFilterObject
分配的內存被釋放。 QObject在被刪除時發出任何事件嗎?或者我怎麼知道它已被刪除並刪除事件過濾器?
我有安裝一個像這樣的事件過濾器對象:如何使相應的QObject被刪除時刪除自身的事件過濾器?
someQObject.installEventFilter(new MyEventFilterObject());
我需要確保當someQObject
被刪除了MyEventFilterObject
分配的內存被釋放。 QObject在被刪除時發出任何事件嗎?或者我怎麼知道它已被刪除並刪除事件過濾器?
我以爲層次只適用於小部件。
對象所有權由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);
如果可以,只需在過濾器上設置父級。如果過濾器需要具有不同的父級,則按上述方式連接信號。
我怎麼能知道它被刪除,並刪除事件過濾器?
你可以簡單地讓事件過濾器成爲一個永久性的對象 - 每個線程只需要一個。一個事件篩選器可以安裝在任意數量的對象上,只要它們全部位於同一個線程中即可。你當然可以這樣做,除非事件過濾器是有狀態的,並且它的狀態是特定於它所過濾的對象的。
難道你不能只有一些QObject作爲MyEventFilterObject的父對象嗎? – user2672165
而這會導致自動刪除?因爲我確定可以,但我認爲層次結構只適用於小部件。 –
父QObject的析構函數銷燬所有子對象。 – user2672165