我有一个类,创建一个窗口和一个树视图。创建树视图的代码非常简单,在init方法中:
tableView = QTableView()
tableView.setModel(model)
tableView.clicked.connect(self.foo)
其中'foo'是应该接受回调的函数(同一类的成员)的名称。函数的签名如下:
def foo(something):
print something
从什么(无可否认的很少)我理解,"东西"参数应该是QModelIndex的一个实例,但它不是。对变量执行print(什么)操作表明我已经发送了foo(…)窗口类。我遗漏了什么?我认为这是正确的方法,基于:
http://qt-project.org/wiki/Signals_and_Slots_in_PySide任何想法?
谢谢你的帮助。
方法的第一个参数是实例本身,它是隐式传递的,通常命名为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将在没有该参数的情况下调用slot。因此,尽管clicked
信号通过QModelIndex
,您仍然可以将该信号连接到不接受参数的方法(如foo
)。结果,您将得到这个无声的'bug'。