使用QSignalMapper和实例方法将PySide连接到信号

时间:2014-02-09 13:52:09

标签: python qt pyside signals-slots

我有一个带桌子的小应用程序。该表在每行上都有一些数据和一个按钮。这些按钮应允许用户删除相应的行数据。我正试图通过clicked按钮信号实现它,但我需要传递行号,所以我尝试使用QSignalMapper,如下面的摘录所示

btnRemoveItem = QPushButton()
btnRemoveItem.clicked.connect(self.removeItem)
self.mapper = QSignalMapper(self)
self.connect(btnRemoveItem, QtCore.SIGNAL("clicked()"), self.mapper,
        QtCore.SLOT("map()"))
self.mapper.setMapping(btnRemoveItem, nextRow)
self.connect(self.mapper, QtCore.SIGNAL("mapped(int)"), self.removeItem(),
        QtCore.SIGNAL("clicked(int)"))

问题是,我的removeItem(self, index)方法是一个实例方法(因为我的表属于一个特定的类)而且我无法以self和{{index的方式映射它1}}。

目前,我的代码失败并出现以下错误:

TypeError: removeItem() takes exactly 2 arguments (1 given)

有没有办法让这项工作正常?或者是否无法在PySide中使用QSignalMapper映射实例方法?

2 个答案:

答案 0 :(得分:3)

我试图在PyQt中重现你的代码,但我并不完全了解Pyside和PyQt之间的差异,所以我的答案更多的是猜测。 尝试删除代码的第二行,并将最后一行替换为:

self.mapper.mapped.connect(self.removeItem)

答案 1 :(得分:3)

在代码的最后一行,在connect方法中,我认为您的代码中存在拼写错误

self.connect(self.mapper, QtCore.SIGNAL("mapped(int)"), self.removeItem(), 
    QtCore.SIGNAL("clicked(int)"))

应该是

self.connect(self.mapper, QtCore.SIGNAL("mapped(int)"), self.removeItem,
    QtCore.SIGNAL("clicked(int)"))

在connect方法中使用self.removeItem()实际上会尝试调用self.removeItem方法而不是为子系统提供连接函数的地址

正如finmor建议的那样,你应该看看new syntax signals and slots,因为它们将极大地帮助澄清你的代码并使它更像Pythonic。