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

相关文章

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

全屋WiFi 7无死角! 华硕 RP-BE58无线信号放大器体验测评

《全屋WiFi7无死角!华硕RP-BE58无线信号放大器体验测评》家里网络总是有很多死角没有网,我决定入手一台支持Mesh组网的WiFi7路由系统以彻底解决网络覆盖问题,最终选择了一款功能非常... 自2023年WiFi 7技术标准(IEEE 802.11be)正式落地以来,这项第七代无线网络技术就以超高速

在 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)运行程序主要组件代码图示分析实现