如何在PySide2/PyQt中查询QPushButton的点击连接及参数?
需求场景
拖拽框选QPushButton后,直接查询按钮绑定的点击函数及对应参数,而非执行点击操作。现有代码已实现按钮与函数的连接、框选逻辑,需替换sel.click()部分实现查询功能。
现有连接代码
def connect_ctrls(self): # connects the controls (buttons) to a respective function self.pushButton.clicked.connect(partial(self.howdy, 'herp')) self.pushButton_2.clicked.connect(self.later)
对应函数实现
def howdy(self, *_): print('Hello') print(_) def later(self, *_): print('Goodbye')
修改后的框选释放事件代码
def mouseReleaseEvent(self, event): if event.button() == qtc.Qt.LeftButton: self.rubberBand.hide() selected = [] rect = self.rubberBand.geometry() for child in self.findChildren(qtw.QPushButton): if rect.intersects(child.geometry()): selected.append(child) for sel in selected: # 遍历按钮clicked信号的所有绑定接收者 for receiver in sel.clicked.receivers(): # 处理functools.partial包装的带参函数 if isinstance(receiver, partial): func_name = receiver.func.__name__ args = receiver.args kwargs = receiver.keywords or {} print(f"按钮{sel.objectName()}绑定的函数: {func_name}") print(f"位置参数: {args}") if kwargs: print(f"关键字参数: {kwargs}") else: # 处理普通无参(或默认参数)函数 func_name = receiver.__name__ print(f"按钮{sel.objectName()}绑定的函数: {func_name}")
代码说明
- 获取信号接收者:通过
sel.clicked.receivers()可以获取当前按钮clicked信号绑定的所有槽函数对象。 - 解析partial对象:如果绑定的是
functools.partial包装的带参函数,可直接访问其func(原始函数)、args(位置参数)、keywords(关键字参数)属性。 - 普通函数处理:对于直接绑定的普通函数,直接获取函数名即可。
输出示例
针对你的代码,框选两个按钮后会输出:
按钮pushButton绑定的函数: howdy 位置参数: ('herp',) 按钮pushButton_2绑定的函数: later
内容的提问来源于stack exchange,提问作者rasonage
相关产品推荐
相关产品推荐

