1. 程式人生 > 其它 >3.1 PyQt5事件、訊號和槽的機制原理--事件處理機制講解

3.1 PyQt5事件、訊號和槽的機制原理--事件處理機制講解

一、事件處理機制講解

1.基礎知識

1>Pyqt提供了兩種機制:

  • 高階的訊號與槽機制:只能解決視窗控制元件的某些特定行為
  • 低階的事件處理機制:可以對視窗控制元件進行更深層次的研究,如自定義視窗

2>區別

  • 事件相當於建立視窗控制元件的
  • 訊號和槽就是對這個視窗控制元件進行使用的

3>常見的QT事件

  • 鍵盤事件:按鍵按下和鬆開
  • 滑鼠事件:滑鼠指標移動、滑鼠按鍵按下和鬆開
  • 拖放事件:用滑鼠進行拖放
  • 滾輪事件:滑鼠滾輪滾動
  • 繪屏事件:重繪螢幕的某些部分
  • 定時事件:定時器到時
  • 焦點事件:鍵盤焦點移動
  • 進入和離開事件:滑鼠指標移入Widget內,或者移出
  • 移動事件:Widgt的位置改變
  • 大小改變事件:Widgt的大小改變
  • 顯示和隱藏事件:Widgt的顯示和隱藏
  • 視窗事件:視窗是否為當前視窗
  • 還包括:Socket事件,剪貼簿事件,字型改變事件,佈局改變事件等

4>使用事件處理的方法
5種事件處理和過濾方法(由弱到前,前兩種方法使用最頻繁)

  • 重新實現事件函式:mousePressEvent(),keyPressEvent(),paintEvent(),這是最常規的事件處理方法
  • 重新實現QObject.event():一般沒有提供該事件的處理函式的情況下,即增加新事件時
  • 安裝事件過濾器:QObject呼叫installEventFilter
  • 在QApplication中安裝事件過濾器
  • 重新實現QApplication的notify()方法

2.程式碼

from PyQt5.Qt import *
import sys


class Window(QWidget) :
    def __init__(self) :
        super().__init__()
        self.setWindowTitle('事件機制')
        self.resize(600, 450)
        self.move(300, 300)


class Btn(QPushButton) :
    def __init__(self, *args, **kwargs) :
        super().__init__(*args, **kwargs)
        self.move(60, 60)
        self.resize(50, 35)
        self.setText('按鈕控制元件')
        self.setStyleSheet('background-color:green')

    def event(self, evt) :
        print(evt, '事件機制')
        return super().event(evt)

    def mousePressEvent(self, evt) :
        print("滑鼠按下事件")
        return super().mousePressEvent(evt)


if __name__ == '__main__' :
    app = QApplication(sys.argv)
    window = Window()
    btn = Btn(window)

    def myslot() :
        print('事件機制')

    btn.pressed.connect(myslot)

    window.show()
    sys.exit(app.exec_())

3.程式結果