PyQt5 信号与槽

  • 信号与槽介绍
  • 内置信号与槽的使用
  • 自定义信号与槽的使用
  • 自定义信号和内置槽函数
  • 自定义信号和自定义槽函数
  • 自定义有参信号
  • 使用自定义信号参数
  • 装饰器信号与槽
  • 信号与槽的断开和连接
  • 多线程中信号与槽的使用

信号与槽介绍

信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。PyQt的窗口控件类有很多内置信号,开发者也可以添加自定义信号。信号与槽有如下特点:

  • 一个信号可以连接多个槽。
  • 一个信号可以连接另一个信号。
  • 信号参数可以使任何Python类型。
  • 一个槽可以连接到多个信号。
  • 信号与槽的连接方式可以是同步连接,也可以是异步连接。
  • 信号与槽的连接可能会跨线程。
  • 信号可以断开连接。

内置信号与槽的使用

这里演示了内置clicked信号连接槽函数的使用

import sys
from PyQt5.QtWidgets import QPushButton, QApplication, QWidget, QMessageBoxapp = QApplication(sys.argv)
widget = QWidget()def showMsg():QMessageBox.information(widget, "信息提示框", "Ok,弹出测试信息")btn = QPushButton("测试点击按钮", widget)
btn.clicked.connect(showMsg)widget.show()
sys.exit(app.exec_())

自定义信号与槽的使用

import sys
from PyQt5.QtCore import QObject, pyqtSignal# 信号对象
class QTypeSignal(QObject):# 定义一个信号sendmsg = pyqtSignal(object)def __init__(self):super(QTypeSignal, self).__init__()def run(self):# 发射信号self.sendmsg.emit('Hello PyQt5')# 槽对象
class QTypeSlot(QObject):def __init__(self):super(QTypeSlot, self).__init__()# 槽对象中的槽函数def get(self, msg):print("QSlot get msg => " + msg)if __name__ == "__main__":send = QTypeSignal()slot = QTypeSlot()# 1print("---把信号绑定到槽函数上---")send.sendmsg.connect(slot.get)send.run()# 2 print('---把信号与槽函数断开---')send.sendmsg.disconnect(slot.get)send.run()

自定义信号和内置槽函数

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtCore import Qtclass WinForm (QWidget):# 自定义信号,不带参数button_clicked_signal = pyqtSignal()def __init__(self, parent=None):super(WinForm, self).__init__(parent)self.setWindowTitle("自定义信号和内置槽函数示例")self.resize(330, 50)btn = QPushButton("关闭", self)# 连接信号与槽函数btn.clicked.connect(self.btn_clicked)# 接收信号,连接到槽函数self.button_clicked_signal.connect(self.close)def btn_clicked(self):# 发送自定义信号,无参数self.button_clicked_signal.emit()if __name__ == "__main__":app = QApplication(sys.argv)win = WinForm()win.show()sys.exit(app.exec_())

自定义信号和自定义槽函数

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *class WinForm(QWidget):# 自定义信号,无参数button_clicked_signal = pyqtSignal()def __init__(self, parent= None):super(WinForm, self).__init__(parent)self.setWindowTitle("自定义信号和槽函数示例")self.resize(350, 50)btn = QPushButton("关闭", self)btn.clicked.connect(self.btn_clicked)self.button_clicked_signal.connect(self.btn_close)def btn_clicked(self):self.button_clicked_signal.emit()def btn_close(self):self.close()if __name__ == "__main__":app = QApplication(sys.argv)win = WinForm()win.show()sys.exit(app.exec_())

自定义有参信号

import sys
from PyQt5.QtCore import pyqtSignal, QObjectclass CustSignal(QObject):# 声明无参数的信号signal1 = pyqtSignal()# 声明带一个int类型参数的信号signal2 = pyqtSignal(int)# 声明带一个int和一个str类型参数的信号signal3 = pyqtSignal(int, str)# 声明带一个列表类型参数的信号signal4 = pyqtSignal(list)# 声明带一个字典类型参数的信号signal5 = pyqtSignal(dict)# 声明一个多重载版本的信号,包括带int和str类型参数的信号和带str类型参数的信号signal6 = pyqtSignal([int,str], [str])def __init__(self, parent=None):super(CustSignal, self).__init__(parent)# 将信号连接到指定的槽函数self.signal1.connect(self.signalCall1)self.signal2.connect(self.signalCall2)self.signal3.connect(self.signalCall4)self.signal4.connect(self.signalCall4)self.signal5.connect(self.signalCall5)self.signal6[int, str].connect(self.signalCall6)self.signal6[str].connect(self.signalCall6OverLoad)# 发射信号self.signal1.emit()self.signal2.emit(100)self.signal3.emit(200, 'hello')self.signal4.emit([1,2,3,4,5,6])self.signal5.emit({"name":"xiaowang", "age":"25"})self.signal6[int, str].emit(300, 'hello world')self.signal6[str].emit('hello pyqt')def signalCall1(self):print('signal1 emit')def signalCall2(self, val):print('signal3 emit, value:', val)def signalCall3(self, val, text):print('signal3 emit, value:', val, text)def signalCall4(self, val):print('signal4 emit, value:', val)def signalCall5(self, val):print('signal5 emit, value:', val)def signalCall6(self, val, text):print('signal6 emit, value:', val, text)def signalCall6OverLoad(self, val):print('signal6 overload emit, value:', val)if __name__ == "__main__":custSignal = CustSignal()

使用自定义信号参数

对于clicked信号来说他是没有参数的,如果连接的槽函数希望可以接收参数,如果直接连接有参数的槽函数会出错,因为信号发出的参数个数一定要大于槽函数接收的参数个数。这里有两种解决方法:

  • 1.使用lambda
  • 2.使用functools模块中的partial函数
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from functools import partial, partialmethodclass WinForm(QMainWindow):def __init__(self, parent=None):super(WinForm, self).__init__(parent)self.setWindowTitle("有参槽函数接收无参信号的解决方法")button1 = QPushButton("Button 1")button2 = QPushButton("Button 2")# 对于clicked信号来说他是没有参数的,如果连接的槽函数希望可以接收参数,如果直接连接有参数# 的槽函数会出错,因为信号发出的参数个数一定要大于槽函数接收的参数个数。这里有两种解决方法:# 1.使用lambda# 2.使用functools模块中的partial函数# 使用lambdabutton1.clicked.connect(lambda: self.onButtonClick(1))# 使用functools模块中的partial函数button2.clicked.connect(partial(self.onButtonClick, 2))layout = QHBoxLayout()layout.addWidget(button1)layout.addWidget(button2)mainwidget = QWidget()mainwidget.setLayout(layout)self.setCentralWidget(mainwidget)def onButtonClick(self, n):print("Button {0} 被按下了".format(n))QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))if __name__ == "__main__":app = QApplication(sys.argv)win = WinForm()win.show()sys.exit(app.exec_())

装饰器信号与槽

装饰器信号与槽
@PyQt5.QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称(self, 参数):
pass
必须先执行了这行代码:QtCore.QMetaObject.connectSlotsByName(self)

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QMessageBox
import sys# 装饰器信号与槽
# @PyQt5.QtCore.pyqtSlot(参数)
# def on_发送者对象名称_发射信号名称(self, 参数):
#   pass
#
# 必须要先执行这行代码:QtCore.QMetaObject.connectSlotsByName(self)class CustWidget(QWidget):def __init__(self, parent=None):super(CustWidget, self).__init__(parent)self.setWindowTitle("装饰器信号与槽Demo")self.resize(350, 50)self.okButton = QPushButton("OK", self)# 使用setObjectName设置对象名称self.okButton.setObjectName("okButton")layout = QHBoxLayout()layout.addWidget(self.okButton)self.setLayout(layout)QtCore.QMetaObject.connectSlotsByName(self)@QtCore.pyqtSlot()def on_okButton_clicked(self):print("单击了OK按钮")QMessageBox.information(self, "信息提示框", "单击了OK按钮")if __name__ == "__main__":app = QApplication(sys.argv)win = CustWidget()win.show()sys.exit(app.exec_())

信号与槽的断开和连接

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *# 信号与槽断开连接class SignalClass(QObject):# 声明无参数的信号signal1 = pyqtSignal()# 声明带一个int类型参数的信号signal2 = pyqtSignal(int)def __init__(self, parent=None):super(SignalClass, self).__init__(parent)# 将信号signal1连接到sig1Call和sig2Call这两个槽函数self.signal1.connect(self.sig1Call)self.signal1.connect(self.sig2Call)# 将signal2连接到signal1self.signal2.connect(self.signal1)# 发射信号self.signal1.emit()self.signal2.emit(1)# 断开signal1,signal2信号与各槽函数的连接self.signal1.disconnect(self.sig1Call)self.signal1.disconnect(self.sig2Call)self.signal2.disconnect(self.signal1)# 将信号signal1和signal2连接到同一个槽函数sig1Callself.signal1.connect(self.sig1Call)self.signal2.connect(self.sig1Call)# 再次发射信号self.signal1.emit()self.signal2.emit(2)def sig1Call(self):print('signal-1 emit')def sig2Call(self):print('signal-2 emit')if __name__ == "__main__":signal = SignalClass()

多线程中信号与槽的使用

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import QThread, pyqtSignalclass Main(QWidget):def __init__(self, parent=None):super(Main, self).__init__(parent)# 创建一个线程实例并设置名称,变量,信号与槽self.thread = MyThread()self.thread.setIdentity("thread1")self.thread.sinOut.connect(self.outText)self.thread.setVal(6)def outText(self, text):print(text)class MyThread(QThread):sinOut = pyqtSignal(str)def __init__(self, parent=None):super(MyThread, self).__init__(parent)self.identity = Nonedef setIdentity(self, text):self.identity = textdef setVal(self, val):self.times = int(val)# 执行线程run方法self.start()def run(self):while self.times > 0 and self.identity:# 发射信号self.sinOut.emit(self.identity + "==>" + str(self.times))self.times -= 1if __name__ == '__main__':app = QApplication(sys.argv)main = Main()main.show()sys.exit(app.exec_())

PyQt5 信号(Signal)与槽(Slot)相关推荐

  1. [转载]qt信号signal和槽slot机制

    好东西! 原文地址:qt信号signal和槽slot机制作者:fox1987 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注 ...

  2. Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制

    目录 1.Qt 与 Qt Creator简介: 2.关于引用头文件的一些事儿: 3.信号(Signal)与槽(Slot)机制: 3.1.一个小例子: 4.自定义信号与槽: 4.1.运行效果: 5.信号 ...

  3. PyQt5 中信号signal 与 槽 slot 的相关知识

    博文视点 文章写得太好了 转载学习 感谢 https://blog.csdn.net/broadview2006/article/details/78475842 在Qt中,每一个QObject对象和 ...

  4. 8. PyQt5信号(signals)和槽(slots)

    PyQt5信号signals和槽slots 1. 什么是信号(signals)和槽(slots)? 2. 信号和槽机制概述 3. 创建自定义的信号和槽 4. 信号和槽的关联(连接) 1. 什么是信号( ...

  5. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

  6. pyqt 槽任意参数_PyQt5快速入门(二)PyQt5信号槽机制

    PyQt5快速入门(二)PyQt5信号槽机制 一.信号槽机制简介 1.信号槽简介 信号槽是Qt的核心机制,也是PyQt编程中对象进行通信的机制.在Qt中,QObject对象和PyQt中所有继承自QWi ...

  7. Python深度学习实战PyQt5信号与槽的连接

    本文讲解信号与槽的连接机制,详细示范各种类型的信号/槽连接的实现方法,这是图形用户界面的核心内容.还将介绍面向对象的程序设计,这是图形用户界面的基本思想 目录 1. 信号与槽(Signals and ...

  8. pyqt5菜鸟教程_[ PyQt入门教程 ] PyQt5信号与槽

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

  9. python输入数据pyqt5_python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例...

    在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口 ...

最新文章

  1. c语言趣味教学题目及答案,C语言趣味程序设计-题目百例.doc
  2. 以前的windows安装文件可以删除吗_安卓手机原来还可以这样安装windows系统,你还不知道吗?...
  3. [Python图像处理] 七.图像阈值化处理及算法对比
  4. 工业交换机单纤或双纤都只是占用一个端口吗?
  5. 012-centos6.5配置静态ip
  6. python pickle库_Python使用Pickle库实现读写序列操作示例
  7. C# 读取Oracle数据库数据
  8. 联想IBM笔记本驱动
  9. JAVA计算机毕业设计无人智慧药柜系统设计(附源码、数据库)
  10. Segger和Micrium之间的区别和联系
  11. 基于天地图的应用服务系统设计开发—以甘肃高校招生服务为例
  12. 解决 Failed to fetch http://172.6.0.2/ubuntu/dists/jammy/main/binary-i386/Packages 404 Not Found问题
  13. git 从当前分支copy出新分支
  14. 3D人脸成像技术整理
  15. Java解析HL7消息进阶(解析自定义HL7消息)
  16. 【JZOJ 6079】【GDOI2019模拟2019.3.23】染色问题
  17. mysql随机不连续数据_用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串...
  18. process.env
  19. android手机浏览器怎么查看网页源代码
  20. iphone编辑过的录音怎么还原_iphone如何恢复误删录音?

热门文章

  1. 嵌入式系统项目设计——基于LED、按键、蜂鸣器的打地鼠游戏(完整代码)
  2. P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序
  3. 基于STM32的高精度温度测控系统-原理图设计
  4. 【计算机基础】Macbook安装Anaconda和使用Jupyter notebook
  5. 华东交通大学2018年ACM双基程序设计大赛题解
  6. 现在开始学程序还不晚吧
  7. NBUT 1665 木块拼接
  8. 农业遥感技术科研成果汇总
  9. p元素包含div元素的问题
  10. conda创建虚拟环境