普通用法

给出一个一般的自定义的绑定方式。注意类方法、静态方法和普通方法的区别。如果普通方法作为槽,那么只有绑定了的对应的实例才可以收到信号。其余两个定义后,不需要实例也可以收到。
下面的例子中,receiver1无法接收信号。

from PyQt5.QtCore import pyqtSignal, QObjectclass Sender(QObject):sendmsg = pyqtSignal(object)  # 这里表明有一个参数def __init__(self):super(Sender, self).__init__()def send_msg(self):self.sendmsg.emit("Hello qt5")class Receiver(QObject):def __init__(self):super(Receiver, self).__init__()def plain_func(self, msg):print("plain_func msg: ", msg)@classmethoddef class_func(cls, msg):print("class_func msg: ", msg)@staticmethoddef static_func(msg):print("static_func msg: ", msg)receiver = Receiver()
receiver1 = Receiver() sender = Sender()
sender.sendmsg.connect(receiver.plain_func)  # 注意这里是实例
sender.sendmsg.connect(Receiver.class_func)
sender.sendmsg.connect(Receiver.static_func)sender.send_msg()

输出结果:

plain_func msg:  Hello qt5
class_func msg:  Hello qt5
static_func msg:  Hello qt5

进阶用法

信号和槽的参数重载

from PyQt5.QtCore import QObject, pyqtSignalclass Sender(QObject):signal_NoParameter = pyqtSignal()signal_OneParameter = pyqtSignal(int)signal_OneParameterOverload = pyqtSignal([int], [str])signal_TwoParameter = pyqtSignal(int, str)signal_TwoParameterOverload = pyqtSignal([int, int], [int, str])def __init__(self):super(Sender, self).__init__()class Receiver(QObject):def __init__(self):super(Receiver, self).__init__()def setValue_NoParameter(self):print("No Parameter")def setValue_OneParameter(self, msg):print("One Parameter: ", msg)def setValue_OneParameterOverload(self, msg):print("One Parameter Overload, msg:", msg, "msg type: ", type(msg))def setValue_TwoParameter(self, msg1, msg2):print("Two Parameter, msg1:", msg1, ", msg2: ", msg2)def setValue_TwoParameterOverload(self, msg1, msg2):print("Two Parameter Overload, msg1:", msg1, ",msg1 type: ", type(msg1),"; msg2:", msg2, ", msg2 type: ", type(msg2))sender = Sender()
receiver = Receiver()
# 关联信号和槽
sender.signal_NoParameter.connect(receiver.setValue_NoParameter)
sender.signal_OneParameter.connect(receiver.setValue_OneParameter)
sender.signal_OneParameterOverload[int].connect(receiver.setValue_OneParameterOverload)
sender.signal_TwoParameter.connect(receiver.setValue_TwoParameter)
sender.signal_TwoParameterOverload[int, int].connect(receiver.setValue_TwoParameterOverload)
# 发射信号测试
sender.signal_NoParameter.emit()
sender.signal_OneParameter.emit(1)
sender.signal_OneParameterOverload.emit(2)
sender.signal_TwoParameter.emit(2, "World")
sender.signal_TwoParameterOverload.emit(1, 2)

输出结果

No Parameter
One Parameter:  1
One Parameter Overload, msg: 2 msg type:  <class 'int'>
Two Parameter, msg1: 2 , msg2:  World
Two Parameter Overload, msg1: 1 ,msg1 type:  <class 'int'> ; msg2: 2 , msg2 type:  <class 'int'>

使用自定义的参数

假设一个情况,某个按键发出了点击信号,但是该信号不能传递参数,而我们却像知道这是第几次发射该信号的。这可以借助lambda表达式或者偏函数实现。代码如下:

from PyQt5.QtWidgets import QMainWindow, QPushButton, QWidget, \QMessageBox, QApplication, QHBoxLayout
from functools import partial
import sysclass WinForm(QMainWindow):def __init__(self, parent=None):super(WinForm, self).__init__(parent)button1 = QPushButton('Button 1')button2 = QPushButton('Button 2')button1.clicked.connect(lambda: self.onButtonClicked(1))  # lambda方式button2.clicked.connect(partial(self.onButtonClicked(2))) # 偏函数方式layout = QHBoxLayout()layout.addWidget(button1)layout.addWidget(button2)main_frame = QWidget()main_frame.setLayout(layout)self.setCentralWidget(main_frame)def onButtonClicked(self, n):print('Button {0} is pushed'.format(n))QMessageBox.information(self, "Message box",'Button {0} is pushed'.format(n))if __name__ == "__main__":app = QApplication(sys.argv)form = WinForm()form.show()sys.exit(app.exec_())

装饰器信号与槽

关于装饰器,可以参考这篇笔记。相当于直接可以定义有函数的信号。一般的使用方式如下:

@QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称(self, 参数):pass

应用代码实例:

# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QWidget, QApplication, \QHBoxLayout, QPushButton
from PyQt5 import QtCore
import sysclass CustWidget(QWidget):def __init__(self, parent=None):super(CustWidget, self).__init__(parent)self.okButton = QPushButton("OK", self)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("Clicked OK Button")if __name__ == "__main__":app = QApplication(sys.argv)win = CustWidget()win.show()sys.exit(app.exec_())

每次点击OK按键,控制台都会输出数据。。。

注意一点,QtCore.QMetaObject.connectSlotsByName(self)这句代码是必须的!!!。这段代码的是PyQt5中信号自动连接到槽函数的核心代码。如果使用装饰器的信号和槽,必须有这一句。

断开连接

使用disconnect函数即可

PyQt5的信号和槽相关推荐

  1. pyqt5中信号与槽的认识

    一.介绍 信号(Signal)和槽(Slot)是Qt中的核心机制,也是PyQt变成中对象之间进行通信的机制 在pyqt5中,每一个QObject对象和pyqt中所有继承自QWidget的控件都支持信号 ...

  2. 【pyqt5学习——信号与槽】实例计时器(解决界面卡顿问题)

    目录 一.方法一:另开线程 1.什么是信号与槽 1)GUI控件(信号)与槽 2)自定义信号与槽 2.实战1:计时器(不自定义信号槽和不使用多线程) 1)界面设计--利用qt-designer设计,然后 ...

  3. 【pyqt5】——信号与槽

    一.简单Demo 简单使用信号和槽(之前常用的使用方式): class DemoWin(QMainWindow):def __init__(self):super().__init__()self.i ...

  4. 关于初学者如何将GUI界面的按钮(如PushButton)与对应的函数连接起来的问题。PyQt5、信号与槽

    在Qt Designer中创建了一个界面,界面上有一个PushButton按钮,命名为PushButton_1,中文名是"检索",想在点击此检索按钮时,触发查询物性的功能. 查询物 ...

  5. Python GUI界面编程初步 05- GUI框架PyQt的运用 - 02 PyQt的信号和槽例子

    前言:本节讨论PyQt的事件event和信号signal的应用: 事件和信号是GUI和应用交互的两个重要的概念. 其中,事件用来驱动,信号和槽用来动态链接,这两个东西合并起来适用于各种组合的GUI的触 ...

  6. PyQt5 笔记3 -- 信号与槽

    PyQt5 笔记3 – 信号与槽(signals and slots) 学习资料: PyQt5 教程 PyQt5 官方文档 1.信号与槽 QT所有的应用都是事件驱动的.事件大部分都是由用户的行为产生的 ...

  7. pyqt5讲解11:自定义信号和槽

    步骤: 定义信号 定义槽函数 连接信号和槽函数 发射信号 代码示例: # -*- coding: utf-8 -*-"""[简介]内置信号槽信号槽示例"&quo ...

  8. Python 小白从零开始 PyQt5 项目实战(3)信号与槽的连接

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...

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

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

最新文章

  1. Kafka Cluster元数据在客户端缓存采用的数据结构
  2. 对象④for in 循环
  3. 那些陌生的C++关键字
  4. div+css+theme
  5. Java学习笔记(一)--JDK环境
  6. json数据解析详解---代码每行进行分析
  7. 第12天学习Java的笔记(数组小练习,数组与方法)
  8. JAVA Servlet API简介及接口与类的用法
  9. 就知道你会没灵感,感恩节psd分层海报模板来咯!
  10. 列车运行图的编制原则是什么_我国农村将有序推进村庄规划编制
  11. 中基协会长洪磊:尽快制定大类资产配置管理办法 推非保本理财转型
  12. 暴风陨落,再无影音​
  13. python对文件进行zip和rar格式的压缩和解压缩(亲测,可用)
  14. 基于三点说构成的夹角提取特征点
  15. 不到3000块钱,如何支撑起每月500万次访问量及80TB流量的网站?
  16. CBLUE-阿里天池中文医疗NLP打榜
  17. Conflicted Confucians
  18. 计算机网络的 89 个核心概念【转自微信公众号Linux爱好者】
  19. ❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码
  20. OSChina 周四乱弹 ——士可杀不可辱,这句话用英语怎么说?

热门文章

  1. Wide-Baseline Image Matching Using Line Signatures
  2. 数据挖掘原理与算法 K-Means算法
  3. Java中String的next()和nextLine()方法
  4. Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)
  5. 卸载anaconda
  6. 静态方法、静态内部类和抽象方法的注意问题
  7. IT职场人生系列之二十:危险职业(下)
  8. IT职场人生系列之十五:语言与技术II
  9. 啦啦啦-我又来了!!!
  10. Windows下如何使用CMD命令进入MySQL数据库