最近在写qt界面时遇到一个问题
问题
绑定一个QAction的触发处理函数时,需要把qt元素名称传入到处理函数中,却发现传入的参数值一直为最后一个符合条件的qt元素的名称
解决方案
参考Javascript的函数闭包,将元素名称用局部变量存储起来,触发动作Action作为返回值返回
原来写法
def connectWordPad(self):
for k,v in self.__dict__.items():
if isinstance(v, QLineEdit) or isinstance(v, QPlainTextEdit):
action = QAction(QIcon(""), "打开写字板", self)
action.triggered.connect(lambda: self.openWordPad(k))
self.__dict__[k].addAction(action)
self.__dict__[k].setContextMenuPolicy(Qt.ActionsContextMenu)
self.connectWordPad()
更改后
def openPadAction(self, name):
action = QAction(QIcon(""), "打开写字板", self)
action.triggered.connect(lambda: self.openWordPad(name))
return action
def connectWordPad(self):
for k,v in self.__dict__.items():
if isinstance(v, QLineEdit) or isinstance(v, QPlainTextEdit):
self.__dict__[k].addAction(self.openPadAction(k))
self.__dict__[k].setContextMenuPolicy(Qt.ActionsContextMenu)
self.connectWordPad()