PyQt5通信機(jī)制 信號(hào)與槽詳解
前言
信號(hào)和槽是PyQt編程對(duì)象之間進(jìn)行通信的機(jī)制。每個(gè)繼承自QWideget的控件都支持信號(hào)與槽機(jī)制。信號(hào)發(fā)射時(shí)(發(fā)送請(qǐng)求),連接的槽函數(shù)就會(huì)自動(dòng)執(zhí)行(針對(duì)請(qǐng)求進(jìn)行處理)。本文主要講述信號(hào)和槽最基本、最經(jīng)常使用方法。就是內(nèi)置信號(hào)和槽的使用的使用方法。
內(nèi)置信號(hào)和槽
所謂內(nèi)置信號(hào)與槽的使用。是指在發(fā)射信號(hào)時(shí),使用窗口控件的函數(shù),而不是自定義的函數(shù)。信號(hào)與槽的連接方法是通過QObject.signal.connect將一個(gè)QObject的信號(hào)連接到另一個(gè)QObject的槽函數(shù)。
在任何GUI設(shè)計(jì)中,按鈕都是最重要的和常用的觸發(fā)動(dòng)作請(qǐng)求的方式,用來與用戶進(jìn)行交互操作。常見的按鈕包括QPushButton、QRadioButton和QCheckBox。這些按鈕都繼承自QAbstractButton類,QAbstractButton提供的信號(hào)包括:
Clicked:鼠標(biāo)左鍵點(diǎn)擊按鈕并釋放觸發(fā)該信號(hào)。最常用。記住這個(gè)就差不多夠了。
Pressed:鼠標(biāo)左鍵按下時(shí)觸發(fā)該信號(hào)
Released:鼠標(biāo)左鍵釋放時(shí)觸發(fā)該信號(hào)
Toggled:控件標(biāo)記狀態(tài)發(fā)生改變時(shí)觸發(fā)該信號(hào)。
內(nèi)置信號(hào)和槽使用實(shí)例
這里實(shí)現(xiàn)一個(gè)點(diǎn)擊按鈕退出界面需求實(shí)現(xiàn)過程來介紹內(nèi)置信號(hào)和槽。開始動(dòng)手。。。
Step1:打開Qt Designer,選擇Widget模板。在工具箱中拖動(dòng)Push Button控件按鈕到主界面。并修改控件顯示名稱。保存為singal.ui。界面如下:
Step2:使用pyuic5 -o singal.py singal.ui轉(zhuǎn)換成.py格式。
Step3:為考慮介紹方便,將調(diào)用程序在singal.py中主程序。其中MyMainForm類中的命令行為Push Button按鈕點(diǎn)擊信號(hào)添加槽函數(shù)。如下
self.pushButton.clicked.connect(self.close)
完整代碼如下(可直接拷貝運(yùn)行,字體加粗部分為添加部分):
# -*- 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", "信號(hào)與槽")) self.pushButton.setText(_translate("Form", "關(guān)閉")) 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_())
運(yùn)行并點(diǎn)擊如下按鈕就可以關(guān)閉窗口
內(nèi)置信號(hào)和自定義槽使用實(shí)例
實(shí)現(xiàn)過程同上述步驟一樣。槽函數(shù)showMsg為自定義函數(shù)。
信號(hào)與槽:self.pushButton.clicked.connect(self.showMsg)
完整代碼如下(可直接拷貝運(yùn)行,字體加粗部分為添加部分):
# -*- 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", "信號(hào)與槽")) self.pushButton.setText(_translate("Form", "運(yùn)行")) 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,內(nèi)置信號(hào)與自定義槽函數(shù)!") if __name__ == "__main__": app = QApplication(sys.argv) myWin = MyMainForm() myWin.show() sys.exit(app.exec_())
運(yùn)行結(jié)果如下:
Qt Designer添加控件信號(hào)與槽
上述介紹的內(nèi)容是通過代碼方式實(shí)現(xiàn)內(nèi)置信號(hào)與槽的連接。那Qt Designer工具可以實(shí)現(xiàn)信號(hào)與槽的連接?之前在第二節(jié)課Qt Designer主界面介紹時(shí)提過信號(hào)槽區(qū)域。一直沒有講如何使用。通過這個(gè)區(qū)域功能是可以實(shí)現(xiàn)信號(hào)與槽的連接的。
還是以添加內(nèi)置信號(hào)與槽來介紹。
Step1:打開Qt Designer界面,找到信號(hào)槽編輯區(qū)。如下
Step2:點(diǎn)擊+號(hào) Sender控件選擇"PushButton"、Signal信號(hào)選擇"clicked",Receiver選擇"Form",內(nèi)置槽函數(shù)選擇"close()"
Step3:保存.ui格式,并使用pyuic轉(zhuǎn)換成.py格式,添加調(diào)用程序,運(yùn)行。效果一樣。這些步驟都介紹過,不再重復(fù)介紹,關(guān)鍵代碼如下:
小結(jié)
本文介紹了PyQt5信號(hào)與槽最基本的使用方法。知道如何在Qt Designer生成的.py文件中添加控件信號(hào)與槽的關(guān)系并且知道如何調(diào)用自定義槽函數(shù)。掌握了這些,應(yīng)該就可以動(dòng)手實(shí)現(xiàn)一些基本的需求了。
到這里,按照這幾個(gè)章節(jié)的介紹應(yīng)該可以動(dòng)手完成簡(jiǎn)單需求的實(shí)現(xiàn)。至于更進(jìn)一步的學(xué)習(xí),可以通過實(shí)踐過程中遇到的問題以及小工具開發(fā)需求去驅(qū)動(dòng)加深理解可能效果會(huì)好一點(diǎn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python批量獲取并保存手機(jī)號(hào)歸屬地和運(yùn)營(yíng)商的示例
這篇文章主要介紹了Python批量獲取并保存手機(jī)號(hào)的歸屬地和運(yùn)營(yíng)商的示例,幫助大家更好的利用python處理數(shù)據(jù),感興趣的朋友可以了解下2020-10-10卷積神經(jīng)網(wǎng)絡(luò)如何實(shí)現(xiàn)提取特征
這篇文章主要介紹了卷積神經(jīng)網(wǎng)絡(luò)如何實(shí)現(xiàn)提取特征問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04python 創(chuàng)建彈出式菜單的實(shí)現(xiàn)代碼
這篇文章主要介紹了python 創(chuàng)建彈出式菜單的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-07-07淺談pytorch中的nn.Sequential(*net[3: 5])是啥意思
這篇文章主要介紹了pytorch中的nn.Sequential(*net[3: 5])是啥意思,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04為什么選擇python編程語(yǔ)言入門黑客攻防 給你幾個(gè)理由!
為什么選擇python編程語(yǔ)言入門黑客攻防,小編今天給你幾個(gè)理由!Python語(yǔ)言的優(yōu)點(diǎn)、Python黑客攻擊優(yōu)點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02Java中重定向輸出流實(shí)現(xiàn)用文件記錄程序日志
這篇文章主要介紹了Java中重定向輸出流實(shí)現(xiàn)用文件記錄程序日志,本文直接給出代碼實(shí)例,并對(duì)代碼做了詳細(xì)注解,需要的朋友可以參考下2015-06-06Python進(jìn)階之高級(jí)用法詳細(xì)總結(jié)
今天帶各位小伙伴學(xué)習(xí)一下Python高級(jí)語(yǔ)法,主要有Lambda表達(dá)式,map函數(shù),filter函數(shù),reduce函數(shù),三大推導(dǎo)式等,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-05-05