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

3

我有一个带表格的小程序,表格中包含一些数据和每行都有一个按钮。这些按钮应该允许用户删除相应的行数据。我试图通过 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)方法是一个实例方法(因为我的表格属于特定的类),我很难以一种可以同时传递selfindex的方式进行映射。
目前,我的代码会出现以下错误:
TypeError: removeItem() takes exactly 2 arguments (1 given)

有没有办法让这个正确工作?或者用PySide无法映射实例方法与?
2个回答

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 method,而不是提供子系统连接函数的地址。

正如finmor所建议的,您应该查看新语法信号和槽,因为它们将极大地帮助澄清您的代码并使其更符合Pythonic风格。


3

我尝试在PyQt中复制您的代码,但我并不完全了解Pyside和PyQt之间的区别,所以我的回答更像是一个猜测。 尝试删除您的代码第二行,并将最后一行替换为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接