[ PyQt入門教程 ] PyQt5訊號與槽
訊號和槽是PyQt程式設計物件之間進行通訊的機制。每個繼承自QWideget的控制元件都支援訊號與槽機制。訊號發射時(傳送請求),連線的槽函式就會自動執行(針對請求進行處理)。本文主要講述訊號和槽最基本、最經常使用方法。就是內建訊號和槽的使用的使用方法。
內建訊號和槽
所謂內建訊號與槽的使用。是指在發射訊號時,使用視窗控制元件的函式,而不是自定義的函式。訊號與槽的連線方法是通過QObject.signal.connect將一個QObject的訊號連線到另一個QObject的槽函式。
在任何GUI設計中,按鈕都是最重要的和常用的觸發動作請求的方式,用來與使用者進行互動操作。常見的按鈕包括QPushButton、QRadioButton和QCheckBox。這些按鈕都繼承自QAbstractButton類,QAbstractButton提供的訊號包括:
Clicked:滑鼠左鍵點選按鈕並釋放觸發該訊號。最常用。記住這個就差不多夠了。
Pressed:滑鼠左鍵按下時觸發該訊號
Released:滑鼠左鍵釋放時觸發該訊號
Toggled:控制元件標記狀態發生改變時觸發該訊號。
內建訊號和槽使用例項
這裡實現一個點選按鈕退出介面需求實現過程來介紹內建訊號和槽。開始動手。。。
Step1:開啟Qt Designer,選擇Widget模板。在工具箱中拖動Push Button控制元件按鈕到主介面。並修改控制元件顯示名稱。儲存為singal.ui。介面如下:
Step2:使用pyuic5 -o singal.py singal.ui轉換成.py格式。
Step3:為考慮介紹方便,將呼叫程式在singal.py中主程式。其中MyMainForm類中的命令列為Push Button按鈕點選訊號新增槽函式。如下
self.pushButton.clicked.connect(self.close)
完整程式碼如下(可直接拷貝執行,字型加粗部分為新增部分):
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'signal.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(431, 166) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41)) font = QtGui.QFont() font.setFamily("YaHei Consolas Hybrid") font.setPointSize(14) self.pushButton.setFont(font) self.pushButton.setObjectName("pushButton") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "訊號與槽")) self.pushButton.setText(_translate("Form", "關閉")) class MyMainForm(QMainWindow, Ui_Form): def __init__(self, parent=None): super(MyMainForm, self).__init__(parent) self.setupUi(self) self.pushButton.clicked.connect(self.close) if __name__ == "__main__": app = QApplication(sys.argv) myWin = MyMainForm() myWin.show() sys.exit(app.exec_())
執行並點選如下按鈕就可以關閉視窗
內建訊號和自定義槽使用例項
實現過程同上述步驟一樣。槽函式showMsg為自定義函式。
訊號與槽:self.pushButton.clicked.connect(self.showMsg)
完整程式碼如下(可直接拷貝執行,字型加粗部分為新增部分):
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'signal.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(431, 166) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41)) font = QtGui.QFont() font.setFamily("YaHei Consolas Hybrid") font.setPointSize(14) self.pushButton.setFont(font) self.pushButton.setObjectName("pushButton") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "訊號與槽")) self.pushButton.setText(_translate("Form", "執行")) class MyMainForm(QMainWindow, Ui_Form): def __init__(self, parent=None): super(MyMainForm, self).__init__(parent) self.setupUi(self) self.pushButton.clicked.connect(self.showMsg) def showMsg(self): QMessageBox.information(self, "資訊提示框", "OK,內建訊號與自定義槽函式!") if __name__ == "__main__": app = QApplication(sys.argv) myWin = MyMainForm() myWin.show() sys.exit(app.exec_())
執行結果如下:
Qt Designer新增控制元件訊號與槽
上述介紹的內容是通過程式碼方式實現內建訊號與槽的連線。那Qt Designer工具可以實現訊號與槽的連線?之前在第二節課Qt Designer主介面介紹時提過訊號槽區域。一直沒有講如何使用。通過這個區域功能是可以實現訊號與槽的連線的。
還是以新增內建訊號與槽來介紹。
Step1:開啟Qt Designer介面,找到訊號槽編輯區。如下
Step2:點選+號 Sender控制元件選擇"PushButton"、Signal訊號選擇"clicked",Receiver選擇"Form",內建槽函式選擇"close()"
Step3:儲存.ui格式,並使用pyuic轉換成.py格式,新增呼叫程式,執行。效果一樣。這些步驟都介紹過,不再重複介紹,關鍵程式碼如下:
小結
本文介紹了PyQt5訊號與槽最基本的使用方法。知道如何在Qt Designer生成的.py檔案中新增控制元件訊號與槽的關係並且知道如何呼叫自定義槽函式。掌握了這些,應該就可以動手實現一些基本的需求了。
到這裡,按照這幾個章節的介紹應該可以動手完成簡單需求的實現。至於更進一步的學習,可以通過實踐過程中遇到的問題以及小工具開發需求去驅動加深理解可能效果會好一