PyQt5零基础入门(四)——信号与槽

信号与槽

  • 前言
  • 信号与槽单对单
    • 直接连接
    • 使用lambda表达式
  • 信号与槽多对多
    • 一个信号连接多个槽
    • 多个信号连接一个槽
    • 信号与信号连接
  • 自定义信号

前言

PyQt5的信号与槽是一种对象之间的通信机制,允许一个QObject对象发出信号,与之相连接的槽函数将会自动执行。信号与槽有以下几个特点:

  • 信号可以携带任意个、任意类型的参数。
  • 一个信号可以连接多个槽,即一个槽可以监听多个信号。
  • 信号与槽的连接方式可以是同步连接,也可以是异步连接。
  • 信号与槽可能会在不同的线程间连接,这时信号连接只能是异步方式。
  • 信号不是必须有槽和其连接,即信号可以不处理。
  • 信号个槽的连接可以被断开。

PyQt5使用pyqtSignal函数为QObject对象创建信号,并把信号定义为类的属性。使用connect()函数可以将信号绑定到槽函数上,使用disconnect()函数可以接触信号和槽之间的绑定。

信号与槽单对单

直接连接

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)

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

在上述代码中创建一个QPushButton对象self.btn,并将其文本设置为"Start"。这个按钮被添加到当前窗口中(由self表示)。

self.btn.clicked.connect(self.change_text): 当按钮被点击时,将调用change_text方法。在change_text的方法中根据当前按钮显示的文字改变为另一个文字。

这个简单的程序创建了一个窗口,其中包含一个可以切换其标签的按钮(“Start"和"Stop”)。每次点击按钮时,都会调用change_text方法来更改其标签。

运行结果如下,运行时按钮上的文字是Start,按下之后会变成Stop
在这里插入图片描述
在这里插入图片描述

使用lambda表达式

import sys
from PyQt5.QtWidgets import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        btn = QPushButton("Start", self)
        btn.clicked.connect(lambda:btn.setText("Stop"))


if __name__ == "__main__":
    app = QApplication([])
    win = Window()
    win.show()
    sys.exit(app.exec())

在上述代码中我们并没有创建新的槽函数,只采用lambda表达式来设置按钮的值。不过与上一个方法相比,这个代码只能将Start变成Stop,但是不能变回Start

运行结果与上种方式相同

信号与槽多对多

一个信号连接多个槽

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)
        self.btn.clicked.connect(self.change_size)

    def change_text(self):
        if self.btn.text() == "Start":
            self.btn.setText("Stop")
        else:
            self.btn.setText("Start")

    def change_size(self):
        self.btn.resize(150, 30)


if __name__ == "__main__":
    app = QApplication([])
    win = Window()
    win.show()
    sys.exit(app.exec())

在代码中,按钮除了连接到了改变按钮文字的槽函数之外还连接到了更换按钮大小的槽函数,所以在按下按钮后除了改变了文字,还改变了按钮大小。

运行结果如下
在这里插入图片描述
在这里插入图片描述

多个信号连接一个槽

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)
        self.btn.released.connect(self.change_text)

    def change_text(self):
        if self.btn.text() == "Start":
            self.btn.setText("Stop")
        else:
            self.btn.setText("Start")


if __name__ == "__main__":
    app = QApplication([])
    win = Window()
    win.show()
    sys.exit(app.exec())

在上述代码中

当按钮被按下时,会触发 pressed 信号,连接 pressed 信号到 self.change_text 函数,每次按钮被按下时,self.change_text 函数都会被调用。

当按钮被释放时,会触发 released 信号,连接 released 信号到 self.change_text 函数,每次按钮被释放时,self.change_text 函数都会被调用。

所以,self.change_text 函数会在按钮被按下和释放时都被调用。

信号与信号连接

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.btn.released)
        self.btn.released.connect(self.change_text)

    def change_text(self):
        if self.btn.text() == "Start":
            self.btn.setText("Stop")
        else:
            self.btn.setText("Start")


if __name__ == "__main__":
    app = QApplication([])
    win = Window()
    win.show()
    sys.exit(app.exec())

在上述代码中将pressed连接到released,而released连接到了change_text。运行效果和上面代码一致

自定义信号

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


class Window(QWidget):
    my_signal = pyqtSignal(int, int)
    def __init__(self):
        super().__init__()
        self.my_signal.connect(self.my_slot)

    def my_slot(self, x, y):
        print(x)
        print(y)

    def mousePressEvent(self, event):
        x = event.pos().x()
        y = event.pos().y()
        self.my_signal.emit(x, y)


if __name__ == "__main__":
    app = QApplication([])
    win = Window()
    win.show()
    sys.exit(app.exec())

在PyQt5中mousePressEvent是鼠标按下时会触发的信号,我们自己定义的信号self.my_signal与槽函数my_slot相连接,当鼠标按下时,self.my_signal使用emit触发self.my_signal信号。效果就是点击窗口会输出当前鼠标位置。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[STM32F407ZET6] GPIO

GPIO模式 F4的GPIO功能比F1的功能更多一些, 但是整体框架一样. F4的输出配置和F1的不同, F4的配置后, 施密特触发器将会开启, 还会对输入寄存器进行采样读取. F1的配置后, 推挽输出将会关闭施密特触发器, 开漏模式读取会读输入寄存器, 推挽模式会读取输出寄存器的值. 输出(全…

贪心算法-活动安排-最详细注释解析

贪心算法-活动安排-最详细注释解析 题目: 学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用…

Three.js 学习笔记之模型(学习中1.18更新)

文章目录 模型 几何体 材质模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形 几何体BufferGeometry缓冲类型几何体BufferGeometry - 基类创建几何体的方式BufferAttribute Types定义顶点法线 geometry.attributes.normal BufferGeom…

CSS实现的 Loading 效果

方式一、纯CSS实现 代码&#xff1a;根据需要复制 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS Animation Library for Developers and Ninjas</title><style>/* ---------------…

阿里云服务器哪个地域好?地域选择的影响因素与建议

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

新上线一个IT公司微信小程序

项目介绍 项目背景: 一家IT公司,业务包含以下六大块: 1、IT设备回收 2、IT设备租赁 3、IT设备销售 4、IT设备维修 5、IT外包 6、IT软件开发 通过小程序,提供在线下单,在线制单,在线销售,业务介绍,推广,会员 项目目的: 业务介绍: 包含企业业务介绍 客户需…

Tessy—嵌入式软件单元测试/集成测试工具

产品概述 Tessy源自戴姆勒—奔驰公司的软件技术实验室&#xff0c;由德国Hitex公司负责销售及技术的支持服务&#xff0c;是一款专门针对嵌入式软件进行单元/集成测试的工具。它可以对C/C代码进行单元、集成测试&#xff0c;可以自动化搭建测试环境、执行测试、评估测试结果并生…

架设一台NFS服务器,并按照以下要求配置

1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台主机&#xff0c;…

Python实战 -- PySide6 制作天气查询软件

一、环境准备 开发环境&#xff1a;Python 3.9.2 pycharm PySide6 申请天气情况 API &#xff1a;https://console.amap.com/dev/key/app designer 设计 ui 目录下 Weather.ui 转换为 Weather.py 结果显示 二、完整代码 import sysfrom PySide6 import QtWidgetsimport…

Oracle 实战手册 工作实战经验总结

目录 一、基本的数据库管理 1、数据库的启动和关闭 ​编辑2、如何确定Oracle的版本&#xff1f; 3、如何修改数据库的内存参数 4、修改用户名密码 5、如何查看最大会话数 6、如何修改oracle数据库的用户连接数 7、解锁用户 8、如何获取被锁定的数据库对象 9、如何确定…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题三 理论题

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

Cloudflare cdn 基本使用

个人版免费试用&#xff0c;一个邮箱账号只能缓存一个网站cdn。 地址&#xff1a;cloudflare.com 创建站点 在网站创建站点&#xff0c;填上你的域名 点击进入网站 缓存全局配置 可清除缓存&#xff0c;设置浏览器缓存时间 我设置了always online,防止服务器经常不稳定 缓…

Docker安全基线检查需要修复的一些问题

一、可能出现的漏洞 限制容器之间的网络流量 限制容器的内存使用量 为Docker启用内容信任 将容器的根文件系统挂载为只读 审核Docker文件和目录 默认情况下&#xff0c;同一主机上的容器之间允许所有网络通信。 如果不需要&#xff0c;请限制所有容器间的通信。 将需要相互通…

运筹说 第95期 | 非线性规划奠基人——库恩与塔克

经过之前的学习&#xff0c;相信大家已经对运筹学的网络计划的内容有了一定的了解&#xff0c;接下来小编将带你学习新一章——非线性规划的内容&#xff0c;让我们先来了解一下非线性规划的诞生和发展历程&#xff0c;然后共同走近非线性规划领域的代表人物——库恩和塔克&…

深度学习记录--归—化输入特征

归化 归化输入(normalizing inputs),对特征值进行一定的处理&#xff0c;可以加速神经网络训练速度 步骤 零均值化 通过x值更新让均值稳定在零附近&#xff0c;即为零均值化 归化方差 适当减小变量方差 解释 归化可以让原本狭长的数据图像变得规整&#xff0c;梯度下降的…

WSL2 git clone命令无法克隆远程仓库

问题描述 最近在往WSL2里拉取git仓库的时候&#xff0c;突然出现了这个问题&#xff0c;WSL2无法连接到git服务器&#xff0c;导致代码无法拉取下来&#xff0c;可能是因为我最近不小心修改了windows的防火墙设置&#xff0c;导致出现了这个问题。 解决办法 在查阅了很多篇…

在uni-app中使用sku插件,实现商品详情页规格展示和交互。

商品详情 - SKU 模块 学会使用插件市场&#xff0c;下载并使用 SKU 组件&#xff0c;实现商品详情页规格展示和交互。 存货单位&#xff08;SKU&#xff09; SKU 概念 存货单位&#xff08;Stock Keeping Unit&#xff09;&#xff0c;库存管理的最小可用单元&#xff0c;通…

uniapp踩坑之项目:canvas第一次保存是空白图片

在ctx.draw()回调生成图片&#xff0c;参考canvasToTempFilePath接口文档 // data imgFilePath: null,// 缓存二维码图片canvas路径//js // 首先在draw&#xff08;&#xff09;里进行本地存储 ...... ctx.draw(false, () >{uni.canvasToTempFilePath({ // 把画布转化成临时…

群晖Drive搭建云同步服务器结合内网穿透实现Obsidian笔记文件远程多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

flutter 五点一:MaterialApp Theme

ThemeData factory ThemeData({bool? applyElevationOverlayColor, //material2的darkTheme下 增加一个半透明遮罩 来凸显阴影效果 material3下无效 貌似没啥用NoDefaultCupertinoThemeData? cupertinoOverrideTheme, //ios组件样式 Iterable<ThemeExtension<dyn…