【PyQt5】信號與槽用法入門


——學習《PyQt5快速開發與實戰》的筆記

0.信號與槽機制的特點:

1.1 signal、slot都繼承自 QtCore
1.2 signal與slot 可以 1對1,1對n,n對1,n對n
1.3 signal可以帶參數,參數可以是python任意類型,str,num(int\float),bool,date,list,dict,tuple)
1.4 QObject.signal.connect(slot),連接
1.5 signal和slot可以是同步,也可以是異步(不懂)
1.6 可以跨線程
1.7 有可能會斷開

核心使用語句:

控件:信號需要跟控件綁定
signal:有內置和自定義兩種方式
操作方法:connect、disconnect、emit
slot:有內置和自定義兩種方式

1.控件綁定信號

from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QMainWindow

class window(QMainWindow):
    # 直接在控件里面寫一個信號變量,是類的全局變量
    btnClicked = pyqtSignal() #無參數信號

2、操作信號的方法

QObject.signal.connect(slot[, type=PyQt5.QtCore.QtAutoConnection[,no_reviver_check=False]])
  # slot - 要連接的那個槽函數,或者是另外一個信號
  # type - 連接的類型,這個一時半會還用不到,
  # no_revicer_check - 不讓底層的C++接收器實例保持存在並且傳遞信號,默認狀態是False,那就是要保持存在並且傳遞信號
QObject.signal.disconnect(slot)
  # slot - 要斷開連接的槽函數
QObject.signal.emit(*args)
  # *args 可變參數,什么類型可以接受

3、入門案例

三種方式:
3.1 內置信號與槽
3.2 自定義信號與槽
3.3 裝飾器信號與槽(1的衍生,先不管)

3.1 內置信號與槽

# 3.1 內置信號和槽的使用
from PyQt5.QtWidgets import QPushButton, QApplication,QWidget
from PyQt5.QtWidgets import QMessageBox
import sys

app =QApplication([])
widget = QWidget()

def showmsg():
    QMessageBox.information(widget,'信號提示框','OK,彈出測試信息')


if __name__ == '__main__':

    btn = QPushButton('測試點擊按鈕',widget)
    btn.clicked.connect(showmsg) # clicked 內置信號方法 showmsg 槽函數名稱,作為索引
    widget.show()
    sys.exit(app.exec_())

  3.2 自定義信號與槽的使用

# 3.2 自定義信號與槽的使用
from PyQt5.QtCore import QObject, pyqtSignal

# 自定義的信號對象
class Q_type_signal( QObject):
    #定義信號
    sendmsg = pyqtSignal(object)

    def __init__(self):
        super(Q_type_signal, self).__init__()

    def run(self,send_msg):
        #發射信號

        self.sendmsg.emit(send_msg) #send_msg 就是下面槽函數 get() 接受的 msg變量

class Q_type_slot( QObject):
    def __init__(self):
        super(Q_type_slot, self).__init__()

    def get(self,msg):
        print('QSlot get msg:'+ msg)

if __name__ == '__main__':
    send = Q_type_signal()
    slot = Q_type_slot()

    send.sendmsg.connect(slot.get)
    send.run('hahaha')

  動作分解:

 執行結果:

 上面執行的是帶有一個參數的信號傳遞,兩個信號也是一樣,只需要添加變量即可:

    def run(self,send_msg,send_int):
        #發射信號
        self.sendmsg.emit(send_msg, send_int) 


    def get(self,msg,int):
        print('QSlot get msg:'+ msg + int)

   3.3 自定義信號與自定義槽

from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
import sys

class Winform(QWidget):
    # 自定義信號,不帶參數
    btn_clicked_signal = pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('自定義信號/內置槽示例')
        self.resize(200, 50)
        btn = QPushButton('關閉', self)
        # 連接信號與槽1
        btn.clicked.connect(self.btn_clicked)
        # 接收信號,連接到自定義槽函數
        # self.btn_clicked_signal.connect(self.close)  
        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)
    win = Winform()
    win.show()
    sys.exit(app.exec_())

自定義的信號:btn_clicked_signal,需要調用btn_clicked()發送信號
自定義的槽:btn_close,內部實際上調用了內置槽函數close()

說實話,這個案例很容易讓人混淆 內置和自定義,無論是信號還是槽。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM