這一部分我們將探索 PyQt5 的事件和信號是如何在應用程序中實現的。
Events事件
所有的GUI應用程序都是事件驅動的。應用程序事件主要產生自用戶,但它們也可通過其他方法來產生,例如一個互聯網連接,一個窗口管理器,或計時器。當我們調用應用程序的exec_()方法,應用程序進入主循環。主循環檢測各種事件,并把它們發送到事件對象。
在事件模型中,有三個參與者:
event source(事件源) event object(事件對象) event target(事件目標)事件源是對象的狀態改變而產生事件。事件對象(事件)是封裝在事件源中狀態變化的對象。事件目標是希望被通知的對象。事件源對象代表處理一個事件到事件目標的任務。
PyQt5使用獨特的信號和槽機制來處理事件。信號和槽用于對象之間的通信,當一個特定的事件發生時,信號被發射。槽可以是任意的Python調用。信號發射時連接到槽被調用。
Signals & slots信號和槽
這是一個簡單的例子演示PyQt5的信號和槽。
#!/usr/bin/python3# -*- coding: utf-8 -*-"""PyQt5 教程這個例子中,我們將QSlider的滑動信號連接到QLCDNumber中。作者:我的世界你曾經來過博客:http://blog.csdn.net/weiaitaowang最后編輯:2016年8月1日"""import sysfrom PyQt5.QtWidgets import (QApplication, QWidget, QSlider, QLCDNumber, QVBoxLayout)from PyQt5.QtCore import Qtclass Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lcd = QLCDNumber(self) sld = QSlider(Qt.Horizontal, self) vbox = QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) self.setLayout(vbox) sld.valueChanged.connect(lcd.display) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('信號/槽') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())在我們的例子中,將用到QtGui.QLCDNumber和QtGui.QSlider。我們通過拖動滑塊改變LCD數字。
sld.valueChanged.connect(lcd.display)
在這里,滑塊的 valueChanged 信號連接到 lcd 的顯示(display)槽。
發送器是對象發送信號。接收器是接收信號的對象。槽的是反饋給信號的方法。
程序執行后

覆寫系統事件處理程序
事件在PyQt5中的處理往往通過重寫事件來處理程序。
#!/usr/bin/python3# -*- coding: utf-8 -*-"""PyQt5 教程在這個例子中,我們執行事件處理程序。作者:我的世界你曾經來過博客:http://blog.csdn.net/weiaitaowang最后編輯:2016年8月1日"""import sysfrom PyQt5.QtWidgets import QApplication, QWidgetfrom PyQt5.QtCore import Qtclass Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('事件處理') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
新聞熱點
疑難解答