這篇文章主要為大家詳細介紹了PyQt5每天必學之事件與信號的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這一部分我們將探索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 sys from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, QLCDNumber, QVBoxLayout) from PyQt5.QtCore import Qt class 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 sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt class 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_())
在我們的範例中,我們重新實作 keyPressEvent() 事件處理程序。
def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close()
如果我們按下鍵盤上的 Esc 鍵,應用程式終止。
Event sender事件發送
為了方便區分多個連接到相同事件目標的事件來源,在PyQt5中可以使用sender()方法。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们确定事件发送对象。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月1日 """ import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): btn1 = QPushButton('按钮一', self) btn1.move(30, 50) btn2 = QPushButton('按钮二', self) btn2.move(150, 50) btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked) self.statusBar() self.setGeometry(300, 300, 300, 150) self.setWindowTitle('事件发送') self.show() def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' 被按下') if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在我們的例子中有兩個按鈕。兩個按鈕都連接 buttonClicked() 方法,我們透過呼叫 sender() 方法來回應點擊的按鈕。
btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked)
兩個按鈕連接到同一個插槽。
def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' 被按下')
我們透過呼叫 sender() 方法來確定訊號源。在應用程式的狀態欄,顯示被按下按鈕的標籤。
程式執行後
自訂發射訊號
從一個QObject 建立的物件可以發出訊號。在下面的例子中,我們將看看我們如何能夠自訂發出訊號。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们显示了如何以发射信号。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月1日 """ import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import pyqtSignal, QObject class Communicate(QObject): closeApp = pyqtSignal() class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.c = Communicate() self.c.closeApp.connect(self.close) self.setGeometry(300, 300, 300, 150) self.setWindowTitle('发射信号') self.show() def mousePressEvent(self, event): self.c.closeApp.emit() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
我們建立一個名為closeApp新的訊號。這個訊號是發射按下滑鼠事件。此訊號被連接到QMainWindow中的close()槽。
class Communicate(QObject): closeApp = pyqtSignal()
建立繼承自 QObject 的 Communicate 類,該類別中有一個 pyqtSignal() 類別的屬性。
self.c = Communicate() self.c.closeApp.connect(self.close)
將我們自訂的 closeApp 訊號連接到QMainWindow中的close()插槽。
def mousePressEvent(self, event): self.c.closeApp.emit()
當我們滑鼠在程式視窗出現點擊動作時,closeApp訊號被發射(emit)。應用程式終止。
相關推薦:
#
以上是PyQt5每天必學之事件與訊號的詳細內容。更多資訊請關注PHP中文網其他相關文章!