• 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_())
    

    未经作者同意请勿转载

    本文来自博客园作者:aixueforever,原文链接:https://www.cnblogs.com/aslanvon/p/15213326.html

  • 相关阅读:
    Matlab命令集常用字符串函数
    统计独立性和统计相关性
    查看solaris下硬盘的物理大小
    Perl命令行开关
    DateFormat.getDateInstance出现Unparseable date
    ActiveMQ 本地转本地再转远程的完整配置
    aspose.words 操作word生成试卷
    汇编in和out介绍
    eclipse开发国际化项目利器:MultiProperties
    RCP+GEF+界面开发(2)[eclipse插件配置LINK方法]
  • 原文地址:https://www.cnblogs.com/aslanvon/p/15213326.html
Copyright © 2020-2023  润新知