一、事件
前言
事件是QT的三大機制之一,一定程度上信號和槽也屬于事件的一種
QT中的事件指哪些:窗口關閉,窗口顯示,敲擊鍵盤,點擊鼠標左鍵、鼠標右鍵、鼠標滾輪,文件拖放等等
1、事件循環
QT中的所有事件,都是放在 "事件循環" 中,被反復執行的
本質上不是一次性的操作,而是這些事件,這些函數,被反復觸發,反復執行,那么就會出現在事件循環中,被反復執行。
2、事件的本質
在QT中,所有的事件,本質上都是受保護的虛函數,發生了對應的事件,就會調用對應的受保護的函數。
所有事件函數中,都有一個事件對象,用來維護并記錄事件發生的過程中所產生的數據,我們可以通過這個對象,獲取事件過程中所產生的數據
void 事件(事件對象 ev){我們可以通過 "事件對象" ev 來獲取事件中的數據
}
3、關閉事件和隱藏事件
1)關閉事件
事件函數:virtual void closeEvent(QCloseEvent* ev);
事件對象:QCloseEvent* ev :關閉事件中基本不產生數據,所以沒啥用
發生條件:1.點擊窗口的關閉鍵2.手動調用函數close();關閉窗口
關閉事件的特點:1.在關閉事件中,會先關閉窗口,再調用析構函數2.只有將所有的窗口都隱藏或關閉時,并且最后一個事件時關閉事件時,才會調用析構函數,并且是調用所有關閉和隱藏了的窗口的析構函數3.關閉事件是通過隱藏事件實現的
2)隱藏事件
事件函數:virtual void hideEvent(QHideEvent* ev);
事件對象:隱藏事件不產生數據,不需要調用
觸發條件:1.點擊窗口的隱藏鍵2.手動調用函數hide();隱藏窗口
隱藏事件的特點:1.隱藏事件不會調用析構函數2.如果操作的最后一個窗口觸發的事件,是隱藏事件,則不論前面有沒有關閉事件,都不會調用析構函數
3)關閉事件和隱藏事件的區別
無論是關閉事件還是隱藏事件,現象都是將窗口給隱藏
區別在于:
隱藏事件,無論如何都不會調用析構函數
關閉事件,會有條件的調用析構函數
4、鍵盤事件
1)鍵盤事件的槽函數
事件函數:virtual void keyPressEvent(QKeyEvent* ev); //按下事件virtual void keyReleaseEvent(QKeyEvent* ev); //釋放事件
事件對象:獲取鍵盤上按下的按鍵的值以及功能
觸發條件:按下、釋放鍵盤上的按鍵
2)如何獲取鍵盤按下的按鍵值
QString QKeyEvent::text() const
功能:以字符串類型,返回鍵盤敲擊的值
3)如何獲取鍵盤按下的所有按鍵(包括功能按鍵)
int QKeyEvent::key() const
功能:可以獲取鍵盤上按下的每一個按鍵,包括功能按鍵
返回值:是一個枚舉,每個枚舉值代表按下的不同按鍵
4)如何獲取鍵盤按下的組合鍵
Qt::KeyboardModifiers modifiers() const
功能:返回按下的組合鍵,如果按下的不是組合鍵,就返回noModifier
5)鍵盤事件的重復觸發機制
鍵盤的重復觸發機制是指,如果按鍵按住,不抬起釋放,就會重復觸發鍵盤的 "按下" - "抬起" 事件,直到按鍵真正被釋放。在鍵盤事件中有一個函數可以檢測按鍵是否正在被按下,就是isAutoRepeat()
函數原型:bool QKeyEvent::isAutoRepeat() const
功能:檢查是否有按鍵正在被按下,如果有就返回True,如果沒有就返回False
5、事件過濾器
QT當中事件的流轉過程如下
1. 發生物理事件;
2. 發生事件的窗口捕獲該事件;
3. 將該事件交給事件過濾器,經過各種過濾以后;
4. 派發給目標窗口;
當前鼠標焦點在哪個窗口,就會派發事件給哪個窗口
如果所有窗口都不具備焦點,則派發個事件發生的窗口
5. 接收到事件的窗口調用對應的事件函數。
1)label文本框
label對象,不會被事件過濾器派發事件
2)將ui界面中某個窗口的類型,修改成我們自己寫的類型
3)手動將事件派發個目標窗口
4)