PySide/PyQt如何实现动态添加的匿名按钮点击执行指定函数
PySide动态按钮点击绑定方案
问题对应解答
- 动态添加的匿名按钮要在点击时执行
add_button函数,只需要在创建按钮实例的环节,将按钮的clicked信号绑定到目标函数即可。你原有代码的问题是仅给初始的「Add」按钮做了信号绑定,后续动态生成的按钮没有执行绑定操作,因此点击无响应。 - 不存在完全绕开PySide信号机制实现按钮点击响应的合理方案。你可能看到过不写
connect语句的实现方式,比如重写控件鼠标点击事件、安装全局事件过滤器,但这类方案本质还是基于Qt的事件信号分发逻辑工作,只是没有用显式的信号绑定语法,不仅代码更繁琐,还容易和原生控件逻辑冲突,完全不适合当前这个简单场景。
修正后代码
你不需要为了绑定信号特意给动态按钮保留长期变量引用,创建实例时直接完成绑定即可,修改后的完整可运行代码如下:
import sys from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * class Template(QWidget): def __init__(self): super().__init__() add_btn = QPushButton('Add') add_btn.clicked.connect(self.add_button) self.grid = QGridLayout(self) self.grid.addWidget(add_btn, 0, 0, 1, 4, Qt.AlignLeft) def add_button(self): i = self.grid.count() - 1 # 创建动态按钮时直接绑定点击信号 new_btn = QPushButton(f'add {i + 1}') new_btn.clicked.connect(self.add_button) self.grid.addWidget(new_btn, 1 + i // 4, i % 4) if __name__ == '__main__': app = QApplication(sys.argv) gui = Template() gui.show() sys.exit(app.exec_())
扩展用法
如果后续需要区分是哪个动态按钮触发了函数,可以在绑定时用lambda传入按钮序号、实例等标识参数,示例写法:
# 绑定的时候传入当前按钮的序号 new_btn.clicked.connect(lambda checked=False, btn_index=i+1: self.handle_dynamic_btn(btn_index))
对应修改槽函数接收传入的参数,即可识别具体的触发源。
内容的提问来源于stack exchange,提问作者Jhonatan Deni
相关产品推荐
相关产品推荐

