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

PyQT5:信号和槽的更多相关文章

  1. [ PyQt入门教程 ] PyQt5信号与槽

    信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...

  2. pyqt5信号与槽2

    信号和槽与类的属性和方法在层次上是相同的,同属与一个类的特征. 信号的定义由工厂函数生成: signal=PyQt5.QtCore.pyqtSignal(types[, name[, result[, ...

  3. PyQt5信号与槽详解

    1.信号与槽函数基础'''信号与槽函数基础,信号是一个事件,发射信号之后槽函数就会执行'''from PyQt5.QtWidgets import *import sys class signal(Q ...

  4. PyQt5信号与槽关联的两种方式

    目录 通过QtDesigner 手动关联的方式 通过QtDesigner 单击菜单栏切换到信号槽编辑模式 单击控件并拖动鼠标到信号的接收对象上,一般为对话框自己,松开鼠标弹出信号和槽选择框 选中cli ...

  5. PyQt5信号与槽

    简单使用 可以使用designer的一个模式定义,也可以自己定义,在__init__函数里,self.btn.clicked.connect(self.text.clear). 注意:槽不用加括号,可 ...

  6. PyQt5中的信号与槽,js 与 Qt 对象之间互相调用

    一.PyQt中的信号与槽 信号(Signal)和槽(Slot)是Qt中的核心机制,用在对象之间互相通信.在Qt中每个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject ...

  7. 五、Pyqt5事件、信号和槽

    PyQt中提供了两种针对事件处理的机制:一种是事件,另一种则是信号和槽. 一.事件 事件处理在PyQt中是比较底层的,常用的事件有键盘事件.鼠标事件.拖放事件.滚轮事件.定时事件.焦点事件.进入和离开 ...

  8. PyQt5(3)——信号和槽初探

    信号和槽是QT的核心机制(当信号发射时,链接的槽函数会自动执行) 在pyqt5中信号和槽通过 QObject.signal.connect()链接. QObject类或子类(QWidget)派生的类都 ...

  9. PyQt5信号-槽机制

    signal -> emit -> slot signal.connect(slot) signal.disconnect(slot) 信号 (singal) 可以连接无数多个槽 (slo ...

随机推荐

  1. 解决:CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.

    log4j给出的异常信息有下面几句: Caused by: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC C ...

  2. ifix与4G DTU对接实现数据显示

    前言: 因公司项目需求,需要使用4G DTU设备对远端RS 485设备进行数据采集,购买了相关产品进行技术实验,成功对接ifix将数据采集并显示,将过程记录,供大家参考. 1,4G DTU基本原理和配 ...

  3. js 数据存入数组

    var tag = []; $('.deltag').each(function(){ if($(this).attr("checked")== 'checked'){ tag.p ...

  4. Nexus Repository Manager 3 远程命令执行漏洞(CVE-2020-10199、CVE-2020-10204)

    [影响版本] Nexus Repository Manager OSS/Pro 3.x <= 3.21.1 poc地址 https://github.com/magicming200/CVE-2 ...

  5. XMAPP搭建DVWA靶机

    1  环境搭建 XMAPP+DVWA (我在win10下搭的环境) 更改了xmapp中Apache的两个端口号: dvwa/config中密钥和端口号按自己情况填好: dvwa/config中文件改为 ...

  6. 全网最硬核Handler面试题深度解析

    1.简述Handler的实现原理 Android 应用是通过消息驱动运行的,在 Android 中一切皆消息,包括触摸事件,视图的绘制.显示和刷新等等都是消息.Handler 是消息机制的上层接口,平 ...

  7. Android茫茫半年求职路,终于斩获三个大厂offer

    前言 2019年底,公司出现危机,开始"优化",本组一个小兄弟被"优化",于是我也着手开始做准备,将来若轮到我被"优化",出去面试时也好打个 ...

  8. Java容器学习——List

    Java容器学习--List 基础知识 数组: ​ 优点:随机存取,可以快速访问元素 ​ 缺点:静态分配内存,存在空间闲置或者溢出现象:不适合进行插入和删除操作,需要移动大量元素. 链表: ​ 优点: ...

  9. [开源]入坑Qt,我的第一个小程序:MD5计算器

    版权声明 --------- 本文仅在知乎与博客园发布.开发者为szx0427 MFC和Win32搞了好几年了,也算是懂了个皮毛,但是一直觉得用这两者开发软件都很麻烦,需要将大量的代码花费在UI等地方 ...

  10. mock平台介绍和moco的简单例子

    1.mock是什么?mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.在具体的测试过程中,我们经常会碰到需要模拟数据或者接口的情况,因为环 ...