《Python Qt GUI與數據可視化編程》第5章 事件處理

第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,具有拖放操作的界面組件

 

<上一章>                 <回主頁>                 <下一章>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章