事件过滤器不断被随机触发



我使用事件过滤器将项目复制并粘贴到我的表格小部件中。复制和粘贴功能工作正常。

我目前遇到的问题是事件过滤器不断被未以任何方式连接到它的函数触发。这最终会引发错误。

事件过滤器块为:

def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.KeyPress and
event.matches(QtGui.QKeySequence.Copy)):
self.copySelection()
return True
return super(MatplotlibWidget, self).eventFilter(source, event)


def copySelection(self):

if self.tabWidget.currentIndex() == 0:
self.rand_table_widget =  self.tableWidget


elif self.tabWidget.currentIndex() == 1:
self.rand_table_widget =  self.tableWidget_2


elif self.tabWidget.currentIndex() == 2:
self.rand_table_widget =  self.tableWidget_3


elif self.tabWidget.currentIndex() == 3:

self.rand_table_widget =  self.tableWidget_4


self.copied_cells = self.rand_table_widget.selectedIndexes()
if self.copied_cells:
rows = sorted(index.row() for index in self.copied_cells)
columns = sorted(index.column() for index in self.copied_cells)
rowcount = rows[-1] - rows[0] + 1
colcount = columns[-1] - columns[0] + 1
table = [[''] * colcount for _ in range(rowcount)]
for index in self.copied_cells:
row = index.row() - rows[0]
column = index.column() - columns[0]
table[row][column] = index.data()
stream = io.StringIO()
csv.writer(stream).writerows(table)
QtWidgets.qApp.clipboard().setText(stream.getvalue())


def keyPressEvent(self, event):


if self.tabWidget.currentIndex() == 0:
self.rand_table_widget =  self.tableWidget


elif self.tabWidget.currentIndex() == 1:
self.rand_table_widget =  self.tableWidget_2


elif self.tabWidget.currentIndex() == 2:
self.rand_table_widget =  self.tableWidget_3


elif self.tabWidget.currentIndex() == 3:

self.rand_table_widget =  self.tableWidget_4

super().keyPressEvent(event)
if event.key() == Qt.Key_C and (event.modifiers() & Qt.ControlModifier):
self.copied_cells = sorted(self.rand_table_widget.selectedIndexes())
elif event.key() == Qt.Key_V and (event.modifiers() & Qt.ControlModifier):
r = self.rand_table_widget.currentRow() - self.copied_cells[0].row()
c = self.rand_table_widget.currentColumn() - self.copied_cells[0].column()
for cell in self.copied_cells:
self.rand_table_widget.setItem(cell.row() + r, cell.column() + c, QTableWidgetItem(cell.data()))

self.tableWidget.installEventFilter(self)
self.tableWidget_2.installEventFilter(self)
self.tableWidget_3.installEventFilter(self)
self.tableWidget_4.installEventFilter(self)
self.tableWidget_6.installEventFilter(self)

我得到的错误是:

line 297, in eventFilter
return super(MatplotlibWidget, self).eventFilter(source, event)
TypeError: super(type, obj): obj must be an instance or subtype of type

问题出在哪里?

而不是return super(MatplotlibWidget, self).eventFilter(source, event)您可以尝试较短的版本return super().eventFilter(source, event)或仅return False(尽管做法不好)。

我建议将eventFilter从小部件移到单独的类,这样它就可以重用并满足"单一责任"原则。

最新更新