Qt事件處理的5個層次

2021-08-16 16:25:33 字數 1556 閱讀 1732

1、重新實現特殊的事件處理器

重寫paintevent()、mousepressevent()等事件處理函式。這是最普通、最簡單也是最常用的形式。例如自定義eventlabel類,繼承於qlabel:

void eventlabel::mousemoveevent(qmouseevent *event)

void eventlabel::mousepressevent(qmouseevent *event)

2、重新實現qobject::event(),event()函式是所有物件的事件入口, 特殊事件處理函式在event()函式中通過switch...case呼叫,完成事件的分發,例如自定義customwidget類,繼承於qwidget,重寫event()函式的一般格式是,通過qevent::type()函式判斷傳入事件型別,對感興趣的事件進行自定義處理,不感興趣的型別傳入父物件:

bool customwidget::event(qevent *e)

}return qwidget::event(e);

}

3、在特定的qobject物件中安裝事件過濾器,這可以解決event()函式的兩點不足:

首先,eventfilter()函式不是protected的,我們可以向任何qobject子類安裝事件過濾器,假如我們想要攔截所有視窗部件的某一事件,我們不用分別子類化所有視窗部件,並重寫所有視窗部件的event()函式,只需在所有視窗部件物件安裝事件過濾器,在重寫主視窗的eventfilter()函式即可;

其次,事件過濾器可以在目標物件接收事件之前進行處理,如果我們將時間過濾掉,目標物件根本不會見到這個事件,被過濾掉的事件根本傳不到目標物件的event()函式中。

自定義mainwindow類如下,為qtextedit物件安裝事件過濾器,呼叫installeventfilter(qobject* )函式,過載eventfilter()函式的格式一般為:首先判斷物件是否為想要攔截事件的目標物件,如果是,則判斷發生事件是否為感興趣的事件,如果是則進行處理,然後返回true(返回true會導致目標物件的event()函式不會被呼叫),如果對發生事件不感興趣,則返回false,去呼叫目標物件的event()函式,如果過濾器接收到的事件不屬於要攔截的目標物件,那麼,此事件以及其對應的物件肯定是父類安裝的過濾器,傳給父類即可。

class mainwindow : public qmainwindow ; 

mainwindow::mainwindow()

bool mainwindow::eventfilter(qobject *obj, qevent *event)

else

} else

}

注意,

事件過濾器和被安裝過濾器的元件必須在同一執行緒,否則,過濾器將不起作用。另外,如果在安裝過濾器之後,這兩個元件到了不同的執行緒,那麼,只有等到二者重新回到同一執行緒的時候過濾器才會有效。

最後兩種層次基本不會使用到。

Qt事件處理的五個層次

標籤 qt 2011 10 12 12 55 2448人閱讀收藏 舉報 qt 5 我是個qt新手,一直對qt事件處理的流程不是太清楚,看了這篇文章 見然後經過自己的思考,把qt事件處理的五個層次 同時也是qt時間處理的流程畫了出來。若有不對請批評指正,不勝感激!層次圖 即事件處理流程圖 及其說明如下...

Qt事件處理的五個層次 Qt自定義事件的實現

我是個qt新手,一直對qt事件處理的流程不是太清楚,看了這篇文章 見然後經過自己的思考,把qt事件處理的五個層次 同時也是qt時間處理的流程畫了出來。若有不對請批評指正,不勝感激!層次圖 即事件處理流程圖 及其說明如下 說明如下 這個過程中,許可權是由大到小的,不算sendevent 和postev...

Qt事件處理

qevent 的關鍵成員函式 void ignore 接受者忽略當前事件,事件可能傳遞給父元件 希望其它物件接著處理當前事件 void accept 接受者期望處理當前事件 不希望其它物件處理當前事件 bool isaccept 判斷當前事件是否被處理 事件過濾器 qobject obj.insta...