PySide(PyQt)利用回调和闭包定义信号与槽

 如图3个按钮,均设为checkable,放置在一个groupbox内成为一个按钮组,要求实现的功能:当点击某个按钮时将本按钮设为选中(setChecked(True),并取消选中按钮站中的其他所有按钮(setChecked(False))。

 

 

 

 首先输入以下代码:

import sys

from PySide6.QtCore import Signal, QObject
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QGroupBox


class MainWindow(QMainWindow):
    btn_signal = Signal(object)

    def __init__(self):
        super().__init__()

        self.setWindowTitle("Main Window with Buttons")
        self.btn_group = QGroupBox('buttonGroup', self)
        self.btn_group.setGeometry(50, 50, 200, 300)

        # 创建按钮
        self.button1 = QPushButton('Button 1', self.btn_group)
        self.button1.setGeometry(50, 50, 100, 50)
        self.button2 = QPushButton('Button 2', self.btn_group)
        self.button2.setGeometry(50, 120, 100, 50)
        self.button3 = QPushButton('Button 3', self.btn_group)
        self.button3.setGeometry(50, 190, 100, 50)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    # 按钮站的定义
    btnStation = window.btn_group.children()
    for b in btnStation:
        b.setCheckable(True)

    # 槽函数
    def slot(btn):
        self = btn
        for b in btnStation:
            b.setChecked(False)
        self.setChecked(True)


    for b in btnStation:
        b.clicked.connect(lambda: slot(b))  # 连接信号到槽函数

    sys.exit(app.exec())

 看上去好像没问题,但是运行结果如下:无论点击哪一个按钮,只有按钮3被选中。

问题在于 slot 函数定义, 在 lambda: slot(b) 中,b 是一个循环变量,其值在整个循环执行期间会发生变化。这意味着在每次循环中,b 的值都会被最后一个按钮对象所覆盖,因此当任何按钮被点击时,实际上都会调用 slot(btnStation[-1]),也就是列表中最后一个按钮的状态会始终被设置为选中,而其他按钮则会被取消选中。

使用回调和闭包:

import sys

from PySide6.QtCore import Signal, QObject
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QGroupBox


class MainWindow(QMainWindow):
    btn_signal = Signal(object)

    def __init__(self):
        super().__init__()

        self.setWindowTitle("Main Window with Buttons")
        self.btn_group = QGroupBox('buttonGroup', self)
        self.btn_group.setGeometry(50, 50, 200, 300)

        # 创建按钮
        self.button1 = QPushButton('Button 1', self.btn_group)
        self.button1.setGeometry(50, 50, 100, 50)
        self.button2 = QPushButton('Button 2', self.btn_group)
        self.button2.setGeometry(50, 120, 100, 50)
        self.button3 = QPushButton('Button 3', self.btn_group)
        self.button3.setGeometry(50, 190, 100, 50)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    # 按钮站的定义
    btnStation = window.btn_group.children()
    for b in btnStation:
        b.setCheckable(True)

    # 回调
    def call_slot(btn):
        # 闭包
        def slot():
            self = btn
            for b in btnStation:
                b.setChecked(False)
            self.setChecked(True)

        return slot


    for b in btnStation:
        b.clicked.connect(call_slot(b))  # 连接信号到槽函数

    sys.exit(app.exec())

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

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

相关文章

PS系统教学24

去水印 仿制图章工具修复画笔工具选区-编辑-填充-内容识别 人体皮肤亮度 人体皮肤发亮 减淡工具 缺点:不能对所有图层取样 选择减淡工具选择高光打完高光用中间调中和一下也可以用历史记录画笔工具进行修饰也可以用加深工具进行微调 图层中的模式 滤色 曝光过…

五、在Qt下加载QVTKWidget控件(VTK8.2.0),生成Visual Studio项目,显示点云(C++)

前言:因为项目需要通过Qt进行显示点云,参考了很多博文,但是并没有全部正确的,东拼西凑算是实现了,花费了两天时间,时间有点久,能力还有有待提升~~ 为此写篇博文记录一下。感谢各位大佬&#xff…

Mac OS 安装frida

安装frida和frida-tools Python是基础,提前装好Python 终端执行 python3 -m pip install frida 如果出现error 按照提示处理 信息提示:brew install pipx 于是终端执行: brew install pipx 安装frida: pipx install frida…

SVN学习(004 subversive操作和解决冲突)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第42p-第p43的内容 操作 新建一个teacher类 添加到版本库(也可以忽略这步 直接提交) 资源-》右键-》team-》提交 另一个用户进行更新 资源-》右键-》team-》更新 解决冲突 用…

谷歌工程师指责OpenAI阻碍AGI研究进展:推迟了5到10年

Google母公司Alphabet的一位软件工程师表示,OpenAI阻碍了人工通用智能(AGI)的发展5到10年。在最近的一次播客访谈中,Google软件工程师弗朗索瓦乔莱特(Franois Chollet )表达了他对AGI研究现状的担忧。这段对…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第46课-使用json文件

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第45课-使用头像 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

如何开展小组讨论以强化员工对TPM的关注度?

TPM是一种旨在提高设备综合效率,通过全员参与的方式,实现设备保养和维护的现代化管理体系。因此,如何开展小组讨论以强化员工对TPM的关注度成为了一个值得探讨的话题。本文,深圳天行健精益管理咨询公司为大家分享具体步骤如下&…

【SpringCloud】Nacos

Nacos简介 2018年6月,Eureka 2.0宣布闭源(但1.X版本仍然活跃),同年7月,阿里Nacos宣布开源,并迅速成为国内开发者关注的焦点。作为Eureka的替代品,Nacos目前已经成为国内开发者的首选。 Nacos&…

PgSQL-添加列、字段的注释

mysql是: 添加列:--alter table 表名 add column 列名 varchar(30);ALTER TABLE p_show ADD COLUMN points VARCHAR(100) COMMENT 所需积分;---------------------------------------------------------------------------------------------添加、修改…

使用nvm安装node.js ,方便管理多个版本的node.js,且程序添加和卸载页面也不会出现多个版本的node.js软件(是一个都不会出现)

首先下载和安装nvm windows 安装 nvm: 需要先把本地安装的Node.js卸载,然后再下载nvm,地址: https://github.com/coreybutler/nvm-windows/releases 一般情况,找到最新版本,然后下载nvm-setup.exe文件就可以…

transformer之位置编码

由于 Transformer 模型中自注意力模块具有置换不变性,因此仅使用注意力机制无法捕捉序列中的顺序关系,从而退化为“词袋模型”。为了解决这一问题,需要引入位置编码(Position Embedding, PE)对于序列信息进行精确建模,从而将绝对或相对位置信息整合到模型中。 什么是位置…

大厂晋升学习方法一:海绵学习法

早晨 30 分钟 首先,我们可以把起床的闹钟提前 30 分钟,比如原来 07:30 的闹钟可以改为 07:00。不用担心提前 30 分钟起床会影响休息质量,习惯以后,早起 30 分钟不但不会影响一天的精力,甚至可能反而让人更有精神。早起…

低成本创业新篇章:上门回收小程序的崛起与挑战

在当今这个快速变化的时代,低成本创业项目成为了许多创业者的首选。其中,上门回收小程序以其独特的商业模式和市场需求,成为了创业市场中的一股新势力。本文将深入探讨上门回收小程序作为低成本创业项目的崛起之路以及面临的挑战。 一、上门回…

WPF/C#:在DataGrid中显示选择框

前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的。 整体实现效果如下: 如果对此感兴趣,可以接下来看具体实现部分。 实践 假设数据库中的…

【51单片机】按键的操作

文章目录 前言读取按键的原理proteus仿真示例代码 总结 前言 在现代电子产品中,按键是用户与设备之间交互的重要组成部分。它们允许用户通过简单的按下来触发特定的操作或命令。在微控制器的背景下,按键的设计和操作对于确保设备的响应性和用户体验至关…

CSS新手入门笔记【导入方法、选择器介绍、选择器优先级、属性详细介绍、盒子模型】

目录 一、目的与优势二、CSS导入方式三、语法结构四、选择器类型基本选择器组合选择器伪类与伪元素属性选择器 六、选择器优先级总结 六、CSS属性1. 字体与文本属性2. 背景属性3. 尺寸与盒模型属性4. 布局与定位5. 列表样式6. 边框与轮廓7. 文本装饰与效果8. 动画与过渡9. 伪类…

RocketMQ-记一次生产者发送消息存在超时异常

目录 1、背景说明 2、排查 2.1、防火墙 2.2、超时时间设置 2.3、服务器资源检查 2.3.1、内存、CPU等 2.3.2、磁盘空间 ​编辑 2.3.3、检查文件描述符 2.3.4、swap区 3、增加swap空间 3.1、创建目录 3.2、格式化 3.3、启动swap 3.4、查看效果 1、背景说明 在一次…

Harbor 不同模块作用以及持久化数据大小建议

目录 1. Harbor 组件1.1 Registry (Harbor Registry)1.2 Database (PostgreSQL)1.3 Jobservice1.4 Chartmuseum1.5 Redis1.6 Trivy 2. 示例 values.yaml3. 总结 搭建环境 使用 NFS 作为持久化存储使用 Helm 在 k8s 上进行搭建 在使用 Helm 安装 Harbor 并配置持久化存储时&am…

ai assistant激活成功后,如何使用

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

Redis-数据类型-zset

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db4数据库4、将一个或多个member元素及其score值加入到有序集key当中5、升序返回有序集key6、升序返回有序集key,让分数一起和值返回的结果集7、降序返回有序集key,让分数一起和值返回到结…