Warm tip: This article is reproduced from stackoverflow.com, please click
pyqt pyqt5 python qtablewidget

Why overriding mousePressEvent in PyQt makes clicking signal doesn't trigger?

发布于 2020-03-27 10:22:51

I am writing a software with Python 3.5 and PyQt5. When I override mousePressEvent of QTableWidget the cellClicked signal doesn't trigger anymore. I need overriding mousePressEvent for getting the pos of mouse clicking and cellClicked for doing another job for cells that are clicked. Why it is like this? Where is the problem? This is my code for overriding the events:

class QTableWidget(QTableWidget):
    def checking(self):
        if (self.endgingposx - self.startingposx) >= 50:
            self.clear()
    def mousePressEvent(self,event):
        event.accept()
        self.startingposx = event.x()
    def mouseReleaseEvent(self,event):
        event.accept()
        self.endgingposx = event.x()
        self.checking()

and this is my clicking signal and it's connected slot:

self.main_table.cellClicked.connect(self.populatescnte)

def populatescnte(self,row,column):
    itemnum = self.scentence_listw.count()
    exec("item{} = QListWidgetItem(QIcon('content/img/food.png'),'{}')".format(itemnum+1,self.main_table.cellWidget(row,column).text))
    exec("self.scentence_listw.addItem(item{})".format(itemnum+1))

self.scentence_listw is a QListWidget. Thank you in advance.


Update Thank you every body this code works for me:

class myTableWidget(QTableWidget):
def checking(self):
    if (self.endgingposx - self.startingposx) >= 50:
    self.clear()
def mousePressEvent(self,event):
    super().mousePressEvent(event)
    self.startingposx = event.x()
def mouseReleaseEvent(self,event):
    super().mouseReleaseEvent(event)
    self.endgingposx = event.x()
    self.checking()
Questioner
Nimda
Viewed
311
Oluwafemi Sule 2017-08-30 15:55

The event isn't being propagated because you have accepted it in your handler.

You allow need to call the the original handler.

FWIW, you can hook up a handler to itemSelectionChanged and get the selectedItems on the table rather than tracking positions.

import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QTableWidget, 
    QTableWidgetItem, QGridLayout
)


class Widget(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()    

    def initUI(self):
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Simple')

        table = TrackedTableWidget()

        layout = QGridLayout()
        layout.addWidget(table, 0, 0)
        self.setLayout(layout)

        self.show()


class TrackedTableWidget(QTableWidget):
    def __init__(self, *args, **kwargs):
        super().__init__()

        self.initUI()    

    def initUI(self):
        self.setRowCount(2)
        self.setColumnCount(2)
        self.setItem(0, 0, QTableWidgetItem('30', 0));
        self.setItem(0, 1, QTableWidgetItem('40', 0));
        self.setItem(1, 0, QTableWidgetItem('50', 0));
        self.setItem(1, 1, QTableWidgetItem('60', 0));

        self.cellClicked.connect(self._handle_cell_clicked)
        self.itemSelectionChanged.connect(self._handle_item_selection)

    def _handle_cell_clicked(self, row, column):
        print('cell_clicked', row, column)
        print('selected cell positions', self.startingposx, self.endingposx)

    def _handle_item_selection(self, *args):
        print(self.selectedItems())
        print('item_selection', args)

    def mousePressEvent(self, event):
        print('mousePressEvent')
        self.startingposx = event.x()
        super().mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        print('mouseReleaseEvent')
        self.endingposx = event.x()
        super().mouseReleaseEvent(event)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    widget = Widget()

    sys.exit(app.exec_())

Reference