(22) 事件總結

2021-09-29 21:42:23 字數 1695 閱讀 2788

qt 的事件是整個 qt 框架的核心機制之一,也比較複雜。說它複雜,更多是因為它涉及到的函式眾多,而處理方法也很多,有時候讓人難以選擇。現在我們簡單總結一下 qt 中的事件機制。

qt 中有很多種事件:滑鼠事件、鍵盤事件、大小改變的事件、位置移動的事件等等。如何處理這些事件,實際有兩種選擇:

1、』所有事件對應乙個事件處理函式,在這個事件處理函式中用乙個很大的分支語句進行選擇,其代表作就是 win32 api 的wndproc()函式:

2、每一種事件對應乙個事件處理函式。qt 就是使用的這麼一種機制:

qt 具有這麼多種事件處理函式,肯定有乙個地方對其進行分發,否則,qt 怎麼知道哪一種事件呼叫哪乙個事件處理函式呢?這個分發的函式,就是event()。顯然,當qmouseevent產生之後,event()函式將其分發給mouseevent()事件處理器進行處理。

event()函式會有兩個問題:

qwidget::event()函式是乙個 protected 的函式,這意味著我們要想重寫event(),必須繼承乙個已有的類。試想,我的程式根本不想要滑鼠事件,程式中所有元件都不允許處理滑鼠事件,是不是我得繼承所有元件,一一重寫其event()函式?protected 函式帶來的另外乙個問題是,如果我基於第三方庫進行開發,而對方沒有提供源**,只有乙個鏈結庫,其它都是封裝好的。我怎麼去繼承這種庫中的元件呢?

event()函式的確有一定的控制,不過有時候我的需求更嚴格一些:我希望那些元件根本看不到這種事件。event()函式雖然可以攔截,但其實也是接收到了qmouseevent物件。我連讓它收都收不到。這樣做的好處是,模擬一種系統根本沒有那個事件的效果,所以其它元件根本不會收到這個事件,也就無需修改自己的事件處理函式。這種需求怎麼辦呢?

事件過濾器可以解決剛剛我們提出的event()函式的兩點不足:首先,事件過濾器不是 protected 的,因此我們可以向任何qobject子類安裝事件過濾器;其次,事件過濾器在目標物件接收到事件之前進行處理,如果我們將事件過濾掉,目標物件根本不會見到這個事件。

該函式會將event傳送給receiver,也就是呼叫receiver->event(event),其返回值就是來自receiver的事件處理器。注意,這個函式為任意執行緒的任意物件的任意事件呼叫,因此,它不存在事件過濾器的執行緒的問題。不過我們並不推薦這麼做,因為notify()函式只有乙個,而事件過濾器要靈活得多。

現在我們可以總結一下 qt 的事件處理,實際上是有五個層次:

重寫paintevent()mousepressevent()等事件處理函式。這是最普通、最簡單的形式,同時功能也最簡單。

重寫event()函式。event()函式是所有物件的事件入口,qobjectqwidget中的實現,預設是把事件傳遞給特定的事件處理函式。

在特定物件上面安裝事件過濾器。該過濾器僅過濾該物件接收到的事件。

C 模版總結(2 2)

編譯器在看到模版定義時不產生 這與看到類定義不產生 一樣,只會在看到用模版產生類並使用了類的物件 或呼叫了函式模版是,編譯器才產生特定的模版例項,這一過程也稱為例項化。普通函式和類的成員函式的定義一般可以放在原始檔中,而函式宣告和類定義需要放在標頭檔案中。由於模版需要進行例項化,編譯器必須訪問定義模...

筆記 魔獸22總結

30.戰術的貫徹性,先三攻後三防嗜血毒龍 25 戰鼓可多 巫醫棍子 放在龍群的下面 靜止陷阱 鍊子 兩三本群補 兩至 醫療波 回程 從此不怕龍鷹,貌似白牛可以驅散鎖!小歪魔瓶 劍聖電球無敵加速卷軸 地面頂不住便於逃命 白牛鍊子 群防 成型 吃兵或秒英雄都不成問題 搞裝備劍聖就一定不能死,在保命上面要...

eXosip事件總結

exosip事件總結 exosip使用udp socket套接字實現底層sip協議的接收 傳送。並且封裝了sip訊息的直譯器。exosip使用定時輪循的方式呼叫osip2的transaction處理函式,這部分是協議棧運轉的核心。透過新增 讀取transaction訊息管道的方式,驅動transac...