在PySide中连接QTableView信号,参数错误



我有一个类,创建一个窗口和一个树视图。创建树视图的代码非常简单,在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'。

最新更新