在PyQT中使用新样式信号传递参数

0 投票
6 回答
3735 浏览
提问于 2025-04-16 04:40

我在用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 个回答

1

这个错误信息告诉你的是,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!)-- 所以我相应地修正了代码片段。

1

你可以通过使用 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)
0

谢谢你的帮助。我偶然发现了QSignalMapper,结果发现这正是我需要的东西。

http://pysnippet.blogspot.com/2010/06/qsignalmapper-at-your-service.html

撰写回答