第5章 事件處理
基於窗體(Widget)的應用程序都是由事件(event)驅動的,鼠標單擊、按下某個按鍵、重繪某個組件、最小化窗口都會產生相應的事件,應用程序對這些事件作出相應的響應處理以實現程序的功能。本章介紹PyQt5中事件的處理方法,包括:
- 常見的特定事件的處理函數及其使用方法。
- 使用event()函數攔截QWidget窗體的事件,然後進行識別和分發處理的方法。
- 使用事件過濾器進行事件攔截和處理的方法。
- 拖放操作的實現方法。
5.1 缺省事件處理
在PyQt5中,事件是一種對象,由抽象類QEvent表示。QEvent還有很多子類表示具體的事件,如QKeyEvent表示按鍵事件,QMouseEvent表示鼠標事件,QPaintEvent表示窗體繪製事件。
當一個事件發生時,PyQt5會根據事件的具體類型用QEvent相應的子類創建一個事件實例對象,然後傳遞給產生事件的對象的event()函數進行處理。QObject類及其子類都可以進行事件的處理,但主要還是窗體類(QWidget及其子類)中用到事件處理。
表5-1 常用的事件缺省處理函數
缺省函數名稱 |
觸發時機 |
參數event類型 |
mousePressEvent() |
鼠標按鍵按下時觸發 |
QMouseEvent |
mouseReleaseEvent() |
鼠標按鍵釋放時觸發 |
QMouseEvent |
mouseMoveEvent() |
鼠標移動時觸發 |
QMouseEvent |
mouseDoubleClickEvent() |
鼠標雙擊時觸發 |
QMouseEvent |
keyPressEvent() |
鍵盤按鍵按下時觸發 |
QKeyEvent |
keyReleaseEvent() |
鍵盤按鍵釋放時觸發 |
QKeyEvent |
paintEvent() |
在界面需要重新繪製時觸發 |
QPaintEvent |
closeEvent() |
一個窗體關閉時觸發,例如窗口關閉時 |
QCloseEvent |
showEvent() |
一個窗體顯示時觸發,例如一個窗口顯示時 |
QShowEvent |
hideEvent() |
一個窗體隱藏時觸發,例如一個窗口最小化時 |
QHideEvent |
resizeEvent() |
組件改變大小時觸發,例如一個窗口改變大小時 |
QResizeEvent |
focusInEvent() |
當一個組件獲得鍵盤焦點時觸發,如一個QLineEdit組件獲得輸入焦點 |
QFocusEvent |
focusOutEvent() |
當一個組件失去鍵盤焦點時觸發,如一個QLineEdit組件失去輸入焦點 |
QFocusEvent |
enterEvent() |
當鼠標進入組件的屏幕空間時觸發,例如鼠標移動到一個QPushButton組件上 |
QEvent |
leaveEvent() |
當鼠標離開組件的屏幕空間時觸發,例如鼠標離開一個QPushButton組件 |
QEvent |
dragEnterEvent() |
拖動操作正在進行,鼠標移動到組件上方時觸發 |
QDragEnterEvent |
dragLeaveEvent() |
拖動操作正在進行,鼠標移出組件上方時觸發 |
QDragLeaveEvent |
dragMoveEvent() |
拖動操作正在進行,鼠標移動時觸發 |
QDragMoveEvent |
dropEvent() |
當拖動操作在某個組件上放下時觸發 |
QDropEvent |
圖5-1 實例Demo5_1運行時界面
事件與信號是有區別的,但是也有關聯。Qt爲某個界面組件定義的信號通常是對某個事件的封裝,例如QPushButton有clicked()信號和clicked(bool)信號,就可以看做是對mouseReleaseEvent()事件的不同封裝。
但是某些時候,一個界面組件無法提供需要的信號,例如QLabel沒有doubleClicked()信號,就無法通過信號與槽的方式實現QLabel組件的鼠標雙擊響應。但是,可以通過事件處理和自定義信號創建一個具有doubleClicked()信號的新的標籤類。
5.2 事件攔截與事件過濾
一個界面組件產生的事件首先會發送給其event()函數做處理,如果event()函數不做任何處理,就自動調用事件對應的缺省處理函數。根據這個特性,可以在event()函數裏做一些事件屏蔽或預處理工作。
PyQt5的事件處理還提供了一個強大的功能:事件過濾器(event filter),可以將一個對象的事件委託給另一個對象來監測並處理。
圖5-5 實例Demo5_4運行時界面
5.3 拖放事件與拖放操作
拖放過程由兩個操作組成:拖動(drag)和放置(drop)。被拖動的組件稱爲拖動點(drag site),接收拖動操作的組件稱爲放置點(drop site)。拖動點與放置點可以是不同的組件,甚至是不同的應用程序,也可以是同一個組件。
本節通過實例Demo5_5演示一個drop site功能的實現,這是一個比較實用的實例。實例運行時界面如圖5-6所示,從Windows資源管理器中拖動一個JPG圖片文件到實例程序窗口上,實例程序會顯示拖動事件的mimeData數據,並顯示圖片。實例程序窗口只接受JPG文件,其他文件一律不接受。
圖5-6 從Windows的資源管理器裏拖一個jpg圖片文件到示例Demo5_5的窗口
5.4 具有拖放操作功能的組件
本節的實例程序Demo5_6演示了QListWidget、QTableWidget、QTreeWidget的拖放操作功能,程序運行時界面如圖5-7所示,有四個具有拖放操作功能的界面組件。在窗體上方還可以對這4個界面組件進行拖放操作相關的設置。在“設置對象”分組框裏選擇一個對象後,在“拖放參數設置”框裏會顯示這個組件的4個屬性的值,也可以設置對象的這4個拖放操作屬性。拖放操作的4個屬性的設置影響到組件的拖放操作的特性
圖5-7 示例Demo5_6,具有拖放操作的界面組件