我有一个创建窗口和树视图的类。创建树视图的代码非常简单,并且在 init 方法中:
tableView = QTableView()
tableView.setModel(model)
tableView.clicked.connect(self.foo)
其中'foo'是应该接受回调的函数名称(同一类的成员)。函数的签名如下:
def foo(something):
print something
从我理解的(确实很少),'something'参数应该是QModelIndex的一个实例,但事实并非如此。在变量上做一个打印(某事)表明我已经发送了foo(...)窗口类。我在这里错过了什么?我认为这是正确的方法,基于:
http://qt-project.org/wiki/Signals_and_Slots_in_PySide
任何想法?
谢谢你的帮助。
答案 0 :(得分:1)
方法的第一个参数是实例本身,它是隐式传递的,通常命名为self
。在您的版本中,something
成为实例,而不是传递的参数。您的方法应如下所示:
def foo(self, something):
print something
作为旁注,通常在将参数传递给不接受任何参数的方法时会出错。像:
class Foo(object):
def bar(something):
print something
f = Foo()
f.bar(1)
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
#TypeError: bar() takes exactly 1 argument (2 given)
但在Qt中,您可以将信号连接到接受较少参数的插槽。 Qt将调用没有该参数的插槽。因此,虽然clicked
信号通过了QModelIndex
,但您仍然可以将此信号连接到不接受参数的方法(例如foo
)。结果,你会得到这个沉默的'bug'。