zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    extern “C”的作用详解
    const和typedef的常见用法详解
    虚函数、纯虚函数、虚函数与析构函数
    C++中四种类型转换方式
    面经中高频知识点归纳(一)
    leetcode Database4
    32位机和64位机下面各类型sizeof的大小
    Spring框架针对dao层的jdbcTemplate操作crud之query查询数据操作
    字符串变量的定义与引用
    使用字符数组及相关函数,求3个国家名中字母顺序排在最前面的国家。
  • 原文地址:https://www.cnblogs.com/aslanvon/p/15213326.html
Copyright © 2011-2022 走看看