Python Qt中为QAction关联方法传递未知数量参数的方案
解决方案
完全不用写一堆passing分支判断,直接用Python的参数展开语法或functools.partial就能实现任意参数数量的传递,而且不用修改现有方法。
方法一:Lambda + 参数展开
利用*args语法直接把传入的参数逐个传递给目标方法,适配任意参数数量:
from PyQt5.QtWidgets import QAction def action_gen(self, menu, text, method, *args): action = QAction(text) menu.addAction(action) # 处理triggered信号默认传递的checked参数,避免参数不匹配 action.triggered.connect(lambda checked=False, *a=args: method(*a)) self.all_actions[text] = action return action
注:triggered信号默认会传递一个布尔值(标记Action是否被选中,针对可复选的Action),如果你的方法需要接收这个参数,把lambda改成lambda checked, *a=args: method(checked, *a)即可。
方法二:functools.partial(更稳妥)
如果担心循环创建Action时lambda的参数绑定陷阱,用functools.partial预先绑定方法和参数更可靠:
from PyQt5.QtWidgets import QAction from functools import partial def action_gen(self, menu, text, method, *args): action = QAction(text) menu.addAction(action) action.triggered.connect(partial(method, *args)) self.all_actions[text] = action return action
这种写法逻辑清晰,能避免lambda在批量创建Action时可能出现的参数错误,推荐优先使用。
另外你原代码里的base是笔误,实际应该是创建的action对象。
内容的提问来源于stack exchange,提问作者sethdhanson
相关产品推荐
相关产品推荐

