PyQT5:信號和槽


PyQT5:信號和槽

信號和槽

Qt的主要特征之一是它使用信號和插槽在對象之間進行通信。

當潛在的事件發生時,會發出一個信號。插槽是可調用的Python,如果將信號連接到插槽,則在發出信號時將調用該插槽。如果沒有連接信號,則什么也不會發生。

信號/插槽機制具有以下功能。

  1. 信號可能連接到許多插槽。
  2. 一個信號也可以連接到另一個信號。
  3. 信號參數可以是任何Python類型。
  4. 插槽可以連接到許多信號。
  5. 連接可以是直接的(同步的)或排隊的(異步的)。
  6. 可以跨線程進行連接。
  7. 信號可能斷開。

信號(特別是未綁定的信號)是類屬性。當信號被引用為該類的實例的屬性時,PyQt5會自動將該實例綁定到該信號,以創建綁定信號。這與Python本身用於從類函數創建綁定方法的機制相同。

一個綁定信號具有connect()disconnect()emit()實現相關聯的功能的方法。它還具有一個signal屬性,該屬性是將由Qt的SIGNAL() 宏返回的信號的簽名。

5種不同的信號

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ParaTrans.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import random
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSignal, QThread
from PyQt5.QtWidgets import *


class Ui_MainWindow(QWidget):
    signal1 = pyqtSignal(str)
    signal2 = pyqtSignal(int, str)
    signal3 = pyqtSignal(list)
    signal4 = pyqtSignal(dict)
    signal5 = pyqtSignal([int, str], [str])

    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 800)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setGeometry(QtCore.QRect(240, 150, 500, 500))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(20, 140, 200, 400))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.widget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.pushButton_3 = QtWidgets.QPushButton(self.widget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.verticalLayout.addWidget(self.pushButton_3)
        self.pushButton_4 = QtWidgets.QPushButton(self.widget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.verticalLayout.addWidget(self.pushButton_4)
        self.pushButton_5 = QtWidgets.QPushButton(self.widget)
        self.pushButton_5.setObjectName("pushButton_5")
        #信號和槽
        self.pushButton.clicked.connect(self.mysignal1)
        self.signal1.connect(self.mySlotFunc1)
        self.pushButton_2.clicked.connect(self.mysignal2)
        self.signal2.connect(self.mySlotFunc2)
        self.pushButton_3.clicked.connect(self.mysignal3)
        self.signal3.connect(self.mySlotFunc3)
        self.pushButton_4.clicked.connect(self.mysignal4)
        self.signal4.connect(self.mySlotFunc4)
        self.pushButton_5.clicked.connect(self.mysignal5)
        self.signal5[int, str].connect(self.mySlotFunc5_1)
        self.signal5[str].connect(self.mySlotFunc5_2)

        self.verticalLayout.addWidget(self.pushButton_5)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def mysignal1(self):
        self.signal1.emit("測試str類型")

    def mysignal2(self):
        self.signal2.emit(123456, "      測試int+str類型")


    def mysignal3(self):
        list = [1,2,3,4,5,6,7,8,9]
        self.signal3.emit(list)

    def mysignal4(self):
        dic = {"北京":"beijing","上海":"shanghai","廣州":"guangzhou","深圳":"shenzhen"}
        self.signal4.emit(dic)
    #([int, str], [str])
    # 聲明一個重載版本的信號,也就是槽函數的參數可以是int和str類型,也可以只有一個str類型的參數

    def mysignal5(self):
        flag = random.random() < 0.5
        if flag == True:
            self.signal5[int, str].emit(999, "重載參數類型:[int, str]")
        elif flag == False:
            self.signal5[str].emit("重載參數類型:[str]")

    #######################
    def mySlotFunc1(self,val):
        self.plainTextEdit.setPlainText(val)
        print("hello")

    def mySlotFunc2(self,intval,text):
        content = str(intval)+text
        self.plainTextEdit.setPlainText(content)

    def mySlotFunc3(self,list):
        print(str(list))
        self.plainTextEdit.setPlainText(str(list))

    def mySlotFunc4(self,dic):
        self.plainTextEdit.setPlainText(str(dic))

    def mySlotFunc5_1(self, val1, val2):
        self.plainTextEdit.setPlainText(str(val1)+val2)

    def mySlotFunc5_2(self, val):
        self.plainTextEdit.setPlainText(str(val))


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "str測試"))
        self.pushButton_2.setText(_translate("MainWindow", "str int測試"))
        self.pushButton_3.setText(_translate("MainWindow", "list測試"))
        self.pushButton_4.setText(_translate("MainWindow", "dict測試"))
        self.pushButton_5.setText(_translate("MainWindow", "重載信號測試"))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    Ui = Ui_MainWindow()
    # 向主窗口上添加控件
    Ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


免責聲明!

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



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