我有一个带桌子的小应用程序。该表在每行上都有一些数据和一个按钮。这些按钮应允许用户删除相应的行数据。我正试图通过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
映射实例方法?
答案 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。