PyQt5的信号与槽函数

目录

一、介绍

二、一个信号连接一个槽

三、一个信号连接多个槽

四、多个信号连接一个槽

五、自定义信号

1、创建自定义信号

2、让自定义信号携带值


一、介绍

在下图中 

  • (1)widget就是PyQt中的控件对象。其实就是组件
  • (2)signal就是控件对象拥有的信号
  • (3)connect()方法用于连接信号和槽,
  • (4)slot是槽函数名称。

 示例:

red信号stop()槽函数进行连接

green信号go()槽函数进行连接

只有这样连接后,发射的信号才可以调用相应的槽函数。 

总结起来就一句话:连接后,信号发射,槽函数“启动”

traffic_light.red.connect(stop)
traffic_light.green.connect(go)
# 在connect()方法中传入的是函数名

二、一个信号连接一个槽

示例:

import sys
from PyQt5.QtWidgets import *
class Window(QWidget):def __init__(self):super(Window, self).__init__()btn = QPushButton('Start', self)btn.clicked.connect(self.change_text)def change_text(self):btn = self.sender() if btn.text() == 'Start':btn.setText('Stop')else:btn.setText('Start')
if __name__ == '__main__':app = QApplication([])window = Window()window.show()sys.exit(app.exec())
  • 实例化一个QPushButton按钮控件之后,我们将按钮的clicked信号与自定义的change_text()槽函数连接起来。
  • 在槽函数中,我们首先通过text()方法获取到当前单击按钮的文本,如果是“Start”,就调用setText()方法将按钮的文本修改为“Stop”。而如果文本是“Stop”,就将其修改为“Start”。
  • 因为要在槽函数中使用btn对象,所以应该在类的初始化函数__init__()中将btn设置为成员变量,也就是self.btn。当然我们也可以直接通过sender()方法获取到当前发射信号的控件对象
  • 每个控件都有相应的内置信号,比如QPushButton控件有clicked、pressed、released等内置信号。当然我们也可以给控件或窗口自定义一个信号

三、一个信号连接多个槽

一个信号可以连接多个槽函数,也就是信号只用发射一次,就可以调用多个槽函数。

import sys
from PyQt5.QtWidgets import *
class Window(QWidget):def __init__(self):super(Window, self).__init__()self.btn = QPushButton('Start', self)self.btn.clicked.connect(self.change_text)  #注释1开始self.btn.clicked.connect(self.change_size)  #注释1结束def change_text(self):if self.btn.text() == 'Start':self.btn.setText('Stop')else:self.btn.setText('Start')def change_size(self):    # 2self.btn.resize(150, 30)
if __name__ == '__main__':app = QApplication([])window = Window()window.show()sys.exit(app.exec())
  • clicked信号连接了change_text()槽函数和change_size()槽函数。
  • change_size()槽函数用于改变按钮的尺寸

四、多个信号连接一个槽

QPushButton除了有clicked信号,还有pressed信号和released信号。

pressed信号是在按钮被“按下”那一刻发射,而released信号则是在按钮被“松开”后发射。

“按下”和“松开”其实就构成了一次单击,也就会发射clicked信号。

import sys
from PyQt5.QtWidgets import *
class Window(QWidget):def __init__(self):super(Window, self).__init__()self.btn = QPushButton('Start', self)self.btn.pressed.connect(self.change_text)     #注释1开始self.btn.released.connect(self.change_text)    #注释1结束def change_text(self):if self.btn.text() == 'Start':self.btn.setText('Stop')else:self.btn.setText('Start')
if __name__ == '__main__':app = QApplication([])window = Window()window.show()sys.exit(app.exec())
  • 将pressed信号和released信号都跟change_text()槽函数连接起来。
  • 那么当按钮被“按下”(不“松开”)时,槽函数就会被调用,按钮文本从“Start”变成了“Stop”。
  • 当“松开”按钮后,槽函数再次被调用,按钮文本从“Stop”变回了“Start”。

五、自定义信号

在PyQt中,各个控件内置的信号已经能够让我们实现许多功能需求,但是如果想要更加个性化的功能,我们还得借助自定义信号来实现。

1、创建自定义信号

自定义信号是通过pyqtSignal来创建的,接下来通过示例代码来演示自定义信号的创建过程。

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Window(QWidget):my_signal = pyqtSignal()                   # 1def __init__(self):super(Window, self).__init__()self.my_signal.connect(self.my_slot)   # 2def my_slot(self):print(self.width())print(self.height())def mousePressEvent(self, event):          # 3self.my_signal.emit()
if __name__ == '__main__':app = QApplication([])window = Window()window.show()sys.exit(app.exec())
  • 实例化一个pyqtSignal对象。
  • 将自定义信号与my_slot()槽函数连接。
  • mousePressEvent()是鼠标按下事件函数,每当鼠标被按下时,该事件函数就会被执行my_siganl信号调用emit()方法将自己发射出去,这样my_slot()槽函数就会被执行,输出窗口的宽和高。

2、让自定义信号携带值

如果想要获取鼠标指针在窗口上的x坐标和y坐标,可以通过信号将坐标值发送过来

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Window(QWidget):my_signal = pyqtSignal(int, int)       # 1def __init__(self):super(Window, self).__init__()self.my_signal.connect(self.my_slot)def my_slot(self, x, y):               # 2print(x)print(y)def mousePressEvent(self, event):      # 3x = event.pos().x()y = event.pos().y()self.my_signal.emit(x, y)
if __name__ == '__main__':app = QApplication([])window = Window()window.show()sys.exit(app.exec())
  • 要通过自定义信号传值,我们必须在实例化pyqtSignal对象时明确要传递的值的类型。由于x坐标和y坐标都是整型值,因此要给pyqtSignal传入两个int。
  • 槽函数也要稍做修改,需要增加两个参数,分别用于接收x坐标和y坐标。
  • 现在我们需要在鼠标按下事件中获取鼠标指针的x和y坐标,并通过emit()方法将其随信号一同发射出去。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/88856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CNN之图像识别

文章目录 1. 图像识别1.1 模式识别1.2 图像识别的过程1.3 图像识别的应用 2. 深度学习发展2.1 深度学习为何崛起2.2 分类与检测2.3 常见的卷积神经网络 3. VGG3.1 VGG163.2 VGG16的结构:3.3 使用卷积层代替全连接3.4 1*1卷积的作用3.5 VGG16代码示例 4. 残差模型-Re…

MATLAB图论合集(一)基本操作基础

本帖总结一些经典的图论问题,通过MATLAB如何计算答案。近期在复习考研,以此来巩固一下相关知识——虽然考研肯定不能用MATLAB代码哈哈,不过在实际应用中解决问题还是很不错的,比C易上手得多~ 图论中的图(Graph&#xf…

Offset Explorer

Offset Explorer 简介下载安装 简介 Offset Explorer(以前称为Kafka Tool)是一个用于管理和使Apache Kafka 集群的GUI应用程序。它提供了一个直观的UI,允许人们快速查看Kafka集群中的对象以及存储在集群主题中的消息。它包含面向开发人员和管…

深入理解MVVM架构模式

原文合集地址如下,有需要的朋友可以关注 本文地址 MVVM原理 MVVM是一种用于构建用户界面的软件架构模式,它的名称代表着三个组成部分:Model(模型)、View(视图)和ViewModel(视图模…

tkinter+爬虫+pygame实现音乐播放器

文章目录 前文安装模块示意图爬虫完整代码pygametkinter完整代码结尾前文 本文将涉及爬虫(数据的获取),pygame(音乐播放器),tkinter(界面显示),将他们汇聚到一起制造一个音乐播放器,欢迎大家的订阅。 安装模块 pip install requests,parsel,lxpy,pygame 示意图

19. python从入门到精通——Web编程

HTTP协议 HTTP协议的常用方法 方法 描述 GET 请求指定的页面信息,并返回实体主体。 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 …

WebAPIs 第四天

1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象:用来表示时间的对象 作用:可以得到当前系统时间 1.1 实例化 ① 概念:在代码中发现了new关键字时,一般将这个操作称为实例化 …

Go 异步任务

Go 异步任务 异步任务在开发中很常见,用来做解耦。本文介绍一下异步队列的实现的几个问题,并且结合三方库实现来分析。 有下面的几个关键点: 用户代码(任务)如何封装数据的存放(数据存放在哪里?就是一个…

[数据集][目标检测]骑电动车摩托车不戴头盔数据集VOC格式1385张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1385 标注数量(xml文件个数):1385 标注类别数:2 标注类别名称:["y","n&q…

“Can‘t open perl script configure : No such file or directory”的解决办法

编译OpenSSL的时候执行到 perl configure 时提示找不到configure, 然后在网上搜了搜,大家给的解决办法一般都是说设置环境变量或者指定configure路径再执行;我试了都不行, 最后我把perl卸了重装就正常了; 然后我换了…

服务器数据恢复-RAID5上层Hyper-V虚拟机数据恢复案例

服务器数据恢复环境: 一台Windows Server服务器,部署Hyper-V虚拟化环境,虚拟机的硬盘文件和配置文件存放在一台DELL存储中。该存储中有一组由4块硬盘组建的RAID5阵列,用来存放虚拟机的数据文件,另外还有一块大容量硬盘…

Pyqt5使QTextEdit或QLabel等框框背景透明

设置:textEdit->setStyleSheet(“background-color: rgb(255, 255, 255, 60);”);

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code)

写本文的原因是官方的教程已经过时了,如果你现在按照官方教程来在 Mac 上进行配置,那么会遇到一堆问题,比如我几乎把能踩的“雷”都踩了。所以这里记录了完整过程,以及各种错误的原因和处理方法,不然以后换 Mac 了或者…

2023上半年京东奶粉行业品牌销售排行榜(京东数据分析平台)

近年来,受新生儿人口数量下降的影响,婴幼儿奶粉市场的需求量萎缩,市场由增量竞争转为存量竞争。根据鲸参谋电商数据分析平台的数据显示,今年上半年,京东婴幼儿奶粉市场的销量将近4400万,环比下降约19%&…

电气测试相关

项目: 长期过电压 瞬态过电压 瞬态欠压 跳跃启动 卸载 纹波电压 电源电压缓慢下降和上升 电源电压缓慢下降、快速上升 复位行为 短暂中断 启动脉冲 带电气系统控制的电压曲线 引脚中断 连接器中断 反极性 信号线和负载电路短路 启动行为 对分流不…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

YOLOv5可视化界面

Pyside6可视化界面 安装Pyside6 激活之前的虚拟环境yolov5 在该环境的终端输入以下命令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyside6输入where python找到当前使用的Python的路径 找到该路径下的designer.exe文件&#xff08;/Lib/site-packages/PySi…

Java IO流——【从零构建信息管理系统】

Java I/O流——【从零构建信息管理系统】 文章目录 什么是Java I/O流介绍理解字节流和字符流的区别 Java I/O流的作用Java I/O流方法InputStream方法Reader方法OutputStream方法Writer方法Java I/O体系的全体类 使用示例Java I/O流在实际应用中使用效果 什么是Java I/O流 介绍…

idea集成chatGPT,免费使用的bito神器

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

Azure创建第一个虚拟机

首先&#xff0c;登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角&#xff0c;点击“虚拟机”按钮&#xff0c;并点击创建&#xff0c;创建Azure虚拟机。 在虚拟机创建页面中&#xff0c;选择所需的基本配置&#xff0c;包括虚拟机名称、操作系统类型和版…