daniel ajj
daniel ajj

Reputation: 93

Event Filter keeps getting triggered randomly

I've use an event filter to copy and paste items to my table widget. The copy and paste function works fine.

The problem I'm having currently is that the event filter keeps getting triggered by functions not connected to it in any way. This ends up throwing up errors.

The event filter block is:

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)

The error I'm getting is:

line 297, in eventFilter
    return super(MatplotlibWidget, self).eventFilter(source, event)

TypeError: super(type, obj): obj must be an instance or subtype of type

What is the problem?

Upvotes: 0

Views: 173

Answers (1)

mugiseyebrows
mugiseyebrows

Reputation: 4761

Instead of return super(MatplotlibWidget, self).eventFilter(source, event) you can try shorter version return super().eventFilter(source, event) or just return False (bad practice, though).

I recommend to move eventFilter away from widget to separate class, so it can be reusable and to satisfy "single responsibility" principle.

Upvotes: 1

Related Questions