信號(hào)與槽的機(jī)制
PyQt5采用了一種被稱為“信號(hào)與槽”機(jī)制的編程模式,用于處理對(duì)象間的通信和事件處理。在PyQt5中,信號(hào)(signal)是對(duì)象發(fā)出的特定事件,例如按鈕被點(diǎn)擊、文本被修改等。而槽(slot)是與信號(hào)相關(guān)聯(lián)的特定動(dòng)作或函數(shù)。當(dāng)信號(hào)被觸發(fā)時(shí),與之相關(guān)聯(lián)的槽會(huì)被自動(dòng)調(diào)用。
信號(hào)發(fā)送與槽的接收
槽函數(shù)為控件的內(nèi)置函數(shù)的操作方法,不同類型的控件分別內(nèi)置了若干方法,例如 QPushButton 控件內(nèi)置的方法包括:點(diǎn)擊、選中、狀態(tài)變化、顯示菜單等,而 QLineEdit 控件內(nèi)置的方法包括:清空、復(fù)制、剪切、粘貼、全選、撤銷操作等。使用控件內(nèi)置的方法作為槽函數(shù),可以直接調(diào)用,不需要對(duì)函數(shù)進(jìn)行定義。
在下面添加一個(gè)pushButton,修改下大小后進(jìn)行復(fù)制。LineEdit也是同樣的操作。
?現(xiàn)在我們就可以通過(guò)右側(cè)的對(duì)象查看器來(lái)看我們控件的一些信息。
其上的中文均需要自己修改。
信號(hào)與槽的連接
我們點(diǎn)擊頂部導(dǎo)航欄Edit,選擇編輯信號(hào)/槽,接下來(lái)我們按住"按鍵1",按住不松將其拉向文本編輯1,這時(shí)會(huì)有彈窗顯示。這里選擇clicked(),右側(cè)選擇clear(),最后選擇ok。
這里在退出后,點(diǎn)擊Ctrl+R預(yù)覽。
這里我們點(diǎn)擊按鍵1,右側(cè)的文本被清空。?
槽函數(shù)為自定義函數(shù)的操作
上面我們使用的控件內(nèi)置的方法作為槽函數(shù),可以直接調(diào)用,不需要對(duì)函數(shù)進(jìn)行其他的定義。但實(shí)際我們的工程項(xiàng)目還是需要我們自己去定義,這樣我們的界面功能才可以更加的完善。
上面的按鍵1實(shí)現(xiàn)的功能是清空右側(cè)的文本,現(xiàn)在我們就在這里自定義一下按鍵2的功能,比如我想實(shí)現(xiàn)按下按鍵2后,清空對(duì)應(yīng)右側(cè)的文本,并添加上“Key 2 operation successful”。在主程序當(dāng)中,我們需要去自定義一個(gè)函數(shù),名為click_pushButton_2()。
需要注意的是該槽函數(shù)的接收者并不是文本編輯控件“l(fā)ineEdit_2”,而是主窗口控件 “MainWindow”。因?yàn)殡m然這里我們是對(duì)“l(fā)ineEdit_2”進(jìn)行操作,但并不意味著只能對(duì)其進(jìn)行操作。
QtDesigner設(shè)置信號(hào)/槽的連接的方法如下:
首先需要在 QtDesigner 將自定義函數(shù)添加到槽函數(shù)配置連接表中。
請(qǐng)與我選擇一樣的步驟,點(diǎn)擊改變信號(hào)/槽,進(jìn)入后如下顯示:
對(duì)話框的上方顯示槽的選項(xiàng),下方顯示信號(hào)選項(xiàng),在上方我們點(diǎn)擊綠色的+號(hào),可以不斷地添加我們自定義的槽函數(shù)。
如何自定義槽函數(shù)呢?這里我們先暫時(shí)放下,放到最后再講?,F(xiàn)在先進(jìn)行信號(hào)與槽的連接,與上面的方法是相同的。
有些不一樣的是,我們這里是拉出來(lái)不進(jìn)行連接,這里會(huì)出現(xiàn)一個(gè)接地符號(hào)。
自定義槽函數(shù)是在主程序中編寫(xiě)自定義的函數(shù)。
相同的發(fā)送者與接收者
這里也是屬于信號(hào)與槽部分的內(nèi)容,什么是相同的發(fā)送者與接收者呢?比如我的一個(gè)開(kāi)關(guān),它能控制on和off,類似這種所有叫做相同的發(fā)送者與接收者。
具體的操作是這樣的,我們首先將控件對(duì)象 “pushButton_4” 從按鈕控件 QPushButton 改變?yōu)檫x項(xiàng)框控件 “QCheckBox”。
這里我們將線引出了后,指向自己,出現(xiàn)彈窗,左側(cè)選擇clicked(bool),右側(cè)選擇setChecked(bool)。
發(fā)送者是動(dòng)作對(duì)象
常見(jiàn)的信號(hào)發(fā)送者是圖形窗口中的各種控件對(duì)象,但也可以是動(dòng)作對(duì)象。
信號(hào)的發(fā)送者是動(dòng)作對(duì)象時(shí),信號(hào)的接收者通常是頂層對(duì)象 “MainWindow”,而槽函數(shù)可以是對(duì)象 “MainWindow” 的內(nèi)置函數(shù),也可以是自定義函數(shù)。
在右側(cè)最下面,選擇信號(hào)與槽。將自定義函數(shù) trigger_actHelp() 添加到槽函數(shù)配置連接表中。
配置如下:
面向?qū)ο蟪绦蛟O(shè)計(jì)
在前面我們的代碼是這樣的。
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import uiDemo1
if __name__ == '__main__':
app = QApplication(sys.argv) # 創(chuàng)建應(yīng)用程序?qū)ο? MainWindow = QMainWindow() # 創(chuàng)建主窗口
ui = uiDemo1.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show() # 顯示主窗口
sys.exit(app.exec_()) # 在主線程中退出
這里是使用的GUIDemo3.py,在主程序中創(chuàng)建主窗口后,直接調(diào)用 UI 中的 Ui_MainWindow(),這種方法叫做面向?qū)ο蟆?/p>
那么在這里我們需要使用面向?qū)ο蟮姆椒ㄟM(jìn)行設(shè)計(jì),
from uiDemo1 import Ui_MainWindow # 導(dǎo)入 uiDemo1.py 中的 Ui_MainWindow 界面類
class MyMainWindow(QMainWindow, Ui_MainWindow): # 繼承 QMainWindow類和 Ui_MainWindow界面類
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent) # 初始化父類
self.setupUi(self) # 繼承 Ui_MainWindow 界面類
if __name__ == '__main__':
app = QApplication(sys.argv) # 在 QApplication 方法中使用,創(chuàng)建應(yīng)用程序?qū)ο? myWin = MyMainWindow() # 實(shí)例化 MyMainWindow 類,創(chuàng)建主窗口
myWin.show() # 在桌面顯示控件 myWin
sys.exit(app.exec_()) # 結(jié)束進(jìn)程,退出程序
上面的自定義槽函數(shù)也是在這類下面進(jìn)行編寫(xiě)。在之前我們已經(jīng)完成了按鍵1,清空了lineEdit_1,接下來(lái),我們來(lái)完善按鍵2和按鍵3,以及幫助的功能。
我的按鍵2,我想通過(guò)點(diǎn)擊,讓lineEdit_2變?yōu)镵ey2 successful,我的按鍵3想要在lineEdit_1、lineEdit_2、lineEdit_3上面分布顯示年月、時(shí)間、Demo4 of GUI by PyQt5等。
那么完整的代碼如下:
import sys
from datetime import datetime
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from uiDemo1 import Ui_MainWindow
class MyMainWindow(QMainWindow, Ui_MainWindow): # 繼承 QMainWindow類和 Ui_MainWindow界面類
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent) # 初始化父類
self.setupUi(self) # 繼承 Ui_MainWindow 界面類
def click_pushButton_2(self):
self.lineEdit_2.setText("Key2 successful")
return
def click_pushButton_3(self):
nowDate = datetime.now().strftime("%Y-%m-%d")
nowTime = datetime.now().strftime("%H:%M:%S")
self.lineEdit_1.setText("Current date: {}".format(nowDate)) # 顯示日期
self.lineEdit_2.setText("Current time: {}".format(nowTime)) # 顯示時(shí)間
self.lineEdit_3.setText("Demo4 of GUI by PyQt5") #
return
def trigger_actHelp(self):
QMessageBox.about(self, "About",
"""道路裂縫檢測(cè)系統(tǒng) v1.0\nCopyright Auorui, SWUST 2023""")
return
if __name__ == '__main__':
app = QApplication(sys.argv) # 在 QApplication 方法中使用,創(chuàng)建應(yīng)用程序?qū)ο? myWin = MyMainWindow() # 實(shí)例化 MyMainWindow 類,創(chuàng)建主窗口
myWin.show() # 在桌面顯示控件 myWin
sys.exit(app.exec_()) # 結(jié)束進(jìn)程,退出程序
效果圖:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-573849.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-573849.html
到了這里,關(guān)于基于PyQt5的UI界面開(kāi)發(fā)——信號(hào)與槽的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!