1. 程式人生 > 其它 >PyQt5入門(二十一)訊號與槽(下)

PyQt5入門(二十一)訊號與槽(下)

技術標籤:PyQt5用partial物件傳遞引數用Lambda表示式傳遞引數pyqt5訊號與槽自動連線pyqt5多執行緒更新UI資料pyqt5為視窗新增訊號

目錄

一.為視窗新增訊號

二.多執行緒更新UI資料

三.訊號與槽自動連線

四.用Lambda表示式為槽函式傳遞引數

五.用partial物件為槽函式傳遞引數


一.為視窗新增訊號

本質就是為一個類新增訊號,只不過這個類是視窗類。

程式碼:

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class WinSignal(QWidget):
    #定義一個訊號
    btn_clicked_signal=pyqtSignal()

    def __init__(self):
        super(WinSignal, self).__init__()
        self.setWindowTitle('為視窗新增訊號')
        self.resize(300,100)

        btn=QPushButton('關閉視窗',self)
        btn.clicked.connect(self.btn_clicked)
        self.btn_clicked_signal.connect(self.btn_close)

    #起觸發函式作用的槽函式
    def btn_clicked(self):
        self.btn_clicked_signal.emit()
    #關閉視窗作用的槽函式
    def btn_close(self):
        self.close()



if __name__=='__main__':
    app=QApplication(sys.argv)
    main=WinSignal()
    main.show()
    sys.exit(app.exec_())

執行結果:

二.多執行緒更新UI資料

在兩個執行緒中傳遞資料。

程式碼:

import sys,math
import time
from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit
from PyQt5.QtCore import QThread,pyqtSignal,QDateTime


class BackendThread(QThread):
    #更新日期的訊號
    update_date=pyqtSignal(str)
    def run(self):
        while True:
            date=QDateTime.currentDateTime()
            currentTime=date.toString('yyyy-MM-dd hh:mm:ss')
            #訊號引數是當前時間
            self.update_date.emit(str(currentTime))
            time.sleep(1)#隔1s就傳送一次訊號


class ThreadUpdateUI(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setWindowTitle('多執行緒更新UI資料')
        self.resize(400,100)
        #存放當前時間
        self.input=QLineEdit(self)
        self.input.resize(400,100)
        self.initUI()

    def initUI(self):
        self.backend=BackendThread()
        self.backend.update_date.connect(self.handleDisplay)
        self.backend.start()#開啟執行緒,自動呼叫run

    # 槽函式是主執行緒
    def handleDisplay(self,data): #data是當前時間
        self.input.setText(data)


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=ThreadUpdateUI()
    main.show()
    sys.exit(app.exec_())

執行結果:

三.訊號與槽自動連線

程式碼:

執行結果:

四.用Lambda表示式為槽函式傳遞引數

程式碼:

執行結果:

五.用partial物件為槽函式傳遞引數

程式碼:

執行結果: