在PyQT中使用新样式信号传递参数
我在用PyQT动态创建按钮时遇到了一些麻烦。
我用一个列表来创建不同值对应的按钮。因为每个按钮都不一样,所以我需要让它们在“按钮点击”这个函数中传递一个参数,这样我才能分别识别它们,以便对每个按钮执行不同的操作。下面是我目前的代码:
for x in self.buttons:
name = str(x)
button = QtGui.QPushButton(Frame)
button.setText(name)
cp_result = self.changeProject(name)
if cp_result is None:
print 'changeProject(%s) is None!', name
else:
print 'changeProject(%s) is OK (%r)', name, cp_result
#button.clicked.connect(cp_result)
setattr(self, "btn_%s" % name, button)
self.btnList.append(button)
def changeProject(self, name):
for x in self.btnList:
if x.isDown:
#Change UI Frame to blahblah
return 'A String'
和Alex一起工作,这是最新的代码,我在测试一个叫changeProject的返回值,显然这个返回值不能是字符串,但我仍然需要确定是哪个自动生成的按钮被按下了。
当前的错误是:TypeError: connect() slot argument should be a callable or a signal, not 'str'
6 个回答
这个错误信息告诉你的是,self.changeProject("%s")
中用来替换 %s
的某个值返回了 None
。你可能是希望这个方法返回其他的东西,对吧?
当然,如果不看到 changeProject
的代码,就很难帮你进一步调试。不过,你可以试着把调用分开,比如在按照lazy1的建议去掉那些冗余的exec之后:
cp_result = self.changeProject(name)
if cp_result is None:
logging.error('changeProject(%s) is None!', name)
else:
logging.info('changeProject(%s) is OK (%r)', name, cp_result)
button.clicked.connect(cp_result)
这样一来,你就不会无用地尝试“连接到 None”了,而是能在错误日志中看到所有导致这个让你惊讶的返回值的名字,然后可以根据这些信息继续调试。不过,更有可能的是,通过查看 changeProject
的源代码,你的错误可能会变得很明显。
编辑:connect
的参数当然是来自 changeProject
(而不是另一个 connect
!)-- 所以我相应地修正了代码片段。
你可以通过使用 setattr
来动态地给对象添加属性。
for x in buttons:
name = str(x)
button = QtGui.QPushButton(Frame)
button.setText(name)
button.clicked.connect(self.changeProject(name))
setattr(self, "btn_%s" % name, button)
谢谢你的帮助。我偶然发现了QSignalMapper,结果发现这正是我需要的东西。
http://pysnippet.blogspot.com/2010/06/qsignalmapper-at-your-service.html