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

2021-06-25 17:52:21 字數 2152 閱讀 9880

我是個qt新手,一直對qt事件處理的流程不是太清楚,看了這篇文章(見然後經過自己的思考,把qt事件處理的五個層次、同時也是qt時間處理的流程畫了出來。若有不對請批評指正,不勝感激!

層次圖(即事件處理流程圖)及其說明如下:

說明如下:

這個過程中,許可權是由大到小的,不算sendevent()和postevent和事件迴圈,notify具有最大控制權,因為它最先見到event,我們可以重寫notify()開始的這個處理鏈上的函式來響應event,從而進行相應的操作。

整個流程中,只有postevent()和最後的事件處理函式是void型別,其它函式都是bool型。

qt自定義事件的實現

後來我就想,那qt的發明人是怎麼定義事件的呢?其實站在qt發明人的角度,qevent就是他們的「自定義事件」!ok!這就好辦了!看看qt發明人怎麼定義的qevent,看看他們怎麼用自己定義的qevent,不就回答了文章開頭的倆問題了嘛!o(∩_∩)o~

我把整個過程總結為「長官定義事件」----->「信使傳遞事件」---->「軍隊接收並響應事件」。

我通過qt assistant查詢那些與事件相關的類,總結如下:

qevent的任務就是定義一些事件型別type,它們都定義在了乙個enum裡。這就是教程中告訴我們的要子類化qevent,派生出myevent,然後在myevent中定義事件型別qevent::type。

我們子類化的時候模仿乙個qevent就好了,而且是繼承,好些都不用子類做了,看一下qevent類中的成員變數和成員函式,就這些東西:

好了,我們通過子類化qevent,把派生出來的myevent看做長官,它定義了具體某個事件。下面看誰是信使。

public functions:

。你還可以通過過載notify來影響送信過程。

我們看看qwidget中與事件有關的成員:

看到了嗎?這些就是event handler,即事件處理函式,這是幹活的那幫人。裡面有我們熟悉的mousepressevent()、keypressevent()等常用的事件處理函式,它們都是protected virtual 型別的,可以過載。所以呀,我們可以子類化qwidget,從而繼承得到好些個event handler,當然也可以自己定義event handler!相當於自己創造士兵來響應事件。通過山寨qwidget,就可以創造自己的軍隊!

還有一點就是,當事件到達軍隊的時候,要先審查再分發,審查就是要經過事件過濾,分發就是通過對經過審查的事件進行判斷再把它分給那個相應的士兵這就又涉及到乙個類qobject,這是qt的萬類之母,這個類中有兩個函式乙個是eventfilter(),另乙個是event()。要先子類化qobject來建立乙個監控者,這個監控者過載eventfilter(),來為軍隊過濾事件。然後還要在軍隊(qwidget)通過呼叫installeventfilter ( qobject * filterobj )來安裝過濾器,引數中的filterob即為監控者。最後在軍隊(qwidget)中過載event()來分發事件,把事件分給對應會幹這個活的士兵(event handler)。

好了,我理解的大體過程就是這樣,我是qt新手,可能有錯的地方,希望路過的大牛能給與指正,我將不勝感激!

什麼話也不如來個例程給力!:

//長官

class myevent: public qevent

};//信使

;bool mysender::notify(qobject *receiver, qevent *event)

}//軍隊

class myarmy: public qobject

;void myarmy::myeventhandler(qevent *event)

bool myarmy::event(qevent *event)

}return qobject::event(event);

}//監控者

class mywatcher: public qobject

;bool mywatcher::eventfilter(qobject *watched, qevent *event)

return qobject::eventfilter(watched,event);

}int main(int argc, char *argv)

執行結果:

好了,就這樣了!可能有錯誤或不準確的地方!望路過的大牛指點!叩謝!orz

**:

Qt事件處理的五個層次

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

Qt事件處理的5個層次

1 重新實現特殊的事件處理器 重寫paintevent mousepressevent 等事件處理函式。這是最普通 最簡單也是最常用的形式。例如自定義eventlabel類,繼承於qlabel void eventlabel mousemoveevent qmouseevent event void...

Qt事件處理

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