【问题标题】:Connecting QTableView signal in PySide, wrong parameters?在 PySide 中连接 QTableView 信号,参数错误?
【发布时间】:2013-01-11 02:56:14
【问题描述】:

我有一个创建窗口和树视图的类。创建树视图的代码非常简单,在 init 方法中:

    tableView = QTableView()
    tableView.setModel(model)
    tableView.clicked.connect(self.foo)  

其中 'foo' 是应该接受回调的函数(同一类的成员)的名称。该函数的签名如下:

def foo(something):
    print something  

据我所知(确实很少),'something' 参数应该是 QModelIndex 的一个实例,但事实并非如此。对变量执行 print(something) 表明我已将 foo(...) 发送到窗口类。我在这里想念什么?我认为这是正确的方法,基于:

http://qt-project.org/wiki/Signals_and_Slots_in_PySide

有什么想法吗?
感谢您的帮助。

【问题讨论】:

  • 忘记了self? (即def foo(self, something):
  • 是的,就是这样。谢谢!
  • @Avaris 您能否添加该评论作为答案,以便解决此问题?

标签: qt signals pyside slot


【解决方案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)。结果,你会得到这个无声的“错误”。

【讨论】:

  • 所以,我想在 Python 中,你应该了解你自己...我会看到自己的。再次感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多