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

相关文章

使用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 模块理论

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name