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

2024-06-21 18:20

本文主要是介绍PySide(PyQt)利用回调和闭包定义信号与槽,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

 

 

 

 首先输入以下代码:

import sysfrom PySide6.QtCore import Signal, QObject
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QGroupBoxclass 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 = btnfor 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 sysfrom PySide6.QtCore import Signal, QObject
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QGroupBoxclass 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 = btnfor b in btnStation:b.setChecked(False)self.setChecked(True)return slotfor b in btnStation:b.clicked.connect(call_slot(b))  # 连接信号到槽函数sys.exit(app.exec())

这篇关于PySide(PyQt)利用回调和闭包定义信号与槽的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模

SpringIOC容器Bean初始化和销毁回调方式

《SpringIOC容器Bean初始化和销毁回调方式》:本文主要介绍SpringIOC容器Bean初始化和销毁回调方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录前言1.@Bean指定初始化和销毁方法2.实现接口3.使用jsR250总结前言Spring Bea

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

使用PyQt实现简易文本编辑器

《使用PyQt实现简易文本编辑器》这篇文章主要为大家详细介绍了如何使用PyQt5框架构建一个简单的文本编辑器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录分析主窗口类 (MyWindow)菜单操作语法高亮 (SyntaxHighlighter)运行程序主要组件代码图示分析实现

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论