2014-02-09 43 views
2

我有一个带有表格的小应用程序。该表在每一行上都有一些数据和一个按钮。这些按钮应允许用户删除相应的行数据。我试图通过clicked按钮信号来实现它,但我需要传递的行数,所以我尝试使用QSignalMapper,如图中摘录如下使用QSignalMapper和实例方法将PySide连接到信号

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的方式映射它。

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

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

有没有办法正确地做这项工作?或者是否不可能将实例方法与PySide中的QSignalMapper映射?

回答

2

我试图在PyQt中重现你的代码,但我没有完全意识到Pyside和PyQt之间的差异,所以我的答案更多的是猜测。 尝试删除代码的第二行和替换最后一个与:

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

非常感谢!它非常有效! – Mauren

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)")) 

的连接方法有self.removeItem()实际上将尝试调用self.removeItem方法,而不是providin g子系统地址连接功能

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