python - 如何向 QTableWidget 的单元格添加右键单击操作(不是菜单)

标签 python pyqt pyqt5 qtablewidget

我目前有一个带有不同单元格的 QTableWidget。当我左键单击某个单元格时,我希望该单元格上的数字增加 1,如果我右键单击单元格,我希望该数字减少 1。

对于第一部分,我使用时没有问题

self.(widget_name).cellClicked.connect(self.addone)

问题出在右键单击上。有没有内置的方法?我怎样才能实现它?我尝试从 QTableWidgets 创建自己的 Table 类并覆盖 mousePressEvent 但不起作用(在单元格周围单击不会执行任何操作,甚至不会选择单元格)。也尝试了 eventFilter 但什么也没有。请参阅下文,了解我在这两种情况下使用的确切代码。

对于鼠标按下事件:

class Table(QtWidgets.QTableWidget):

    def __init__(self,parent=None):
        QtWidgets.QTableWidget.__init__(self,parent)

    def mousePressEvent(self,QMouseEvent):
        if QMouseEvent.button() == QtCore.LeftButton:
            print('left') #FOR DEBUGGING
            row = self.currentRow()
            column = self.currentColumn()
            new_text = round(float(self.item(row,column).text()) + 1,2)
            self.item(row,column).setText(str(new_text))          

        elif event.button() == QtCore.RightButton:
            print('right') #FOR DEBUGGING
            row = self.currentRow()
            column = self.currentColumn()
            new_text = round(float(self.item(row,column).text()) - 1,2)
            self.item(row,column).setText(str(new_text)) 

对于事件过滤器:

class Table(QtWidgets.QTableWidget):
    def __init__(self,parent=None):
        QtWidgets.QTableWidget.__init__(self,parent)
        self.installEventFilter(self)

    def eventFilter(self,QObject,event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            if event.button() == QtCore.LeftButton:
                print('left') #FOR DEBUGGING
                row = self.currentRow()
                column = self.currentColumn()
                new_text = round(float(self.item(row,column).text()) + 1,2)
                self.item(row,column).setText(str(new_text))          

            elif event.button() == QtCore.RightButton:
                print('right') #FOR DEBUGGING
                row = self.currentRow()
                column = self.currentColumn()
                new_text = round(float(self.item(row,column).text()) - 1,2)
                self.item(row,column).setText(str(new_text))

对于两者(创建表)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        self.centralwidget = QtWidgets.QWidget(self)
        ....
        self.parameters = Table(self.centralwidget)
        ...
...

调试文本(打印“左”或“右”)也不会出现在控制台中。

最佳答案

当您覆盖一个方法时,它总是调用父级的方法,因为它可能正在执行其他类型的任务,而您将忽略它。另一方面,如果我们这样做,委托(delegate)将被激活来编辑文本,而这是我们不想要的,因此我们建立一个没有发布者返回的新委托(delegate),如下所示:

import sys
from PyQt5 import QtWidgets, QtGui, QtCore

class ReadOnlyDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, *args, **kwargs):
        return

class Table(QtWidgets.QTableWidget):
    def __init__(self, *args, **kwargs):
        QtWidgets.QTableWidget.__init__(self, *args, **kwargs)
        self.setItemDelegate(ReadOnlyDelegate(self))

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            it = self.itemAt(event.pos())
            new_text = round(float(it.text()) + 1,2)
            it.setText(str(new_text))          

        elif event.button() == QtCore.Qt.RightButton:
            it = self.itemAt(event.pos())
            new_text = round(float(it.text()) - 1,2)
            it.setText(str(new_text))     
        QtWidgets.QTableWidget.mousePressEvent(self, event)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)

        table = Table(5, 5)
        self.setCentralWidget(table)
        for i in range(5):
            for j in range(5):
                item = QtWidgets.QTableWidgetItem("{}".format(i*j))
                table.setItem(i, j, item)

if __name__=='__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

关于python - 如何向 QTableWidget 的单元格添加右键单击操作(不是菜单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50681354/

相关文章:

python - 如何计算数据帧中一行中非 NaN 列的数量?

python - PyQt - 如何打开目录文件夹?

python - PyQt5 中的 WebSocket 服务器,显然是正确的,但我无法连接

python - 在非GUI代码中访问fbs资源文件

python - 在 Python 中解析 S 表达式

python - Python 类中 'cls' 和 'self' 之间的区别?

python - 在 OpenCV 2.4 上找不到 GaussianBlur 模块

python - 如何从 pyinstaller 的输出文件创建 .app?

python - 如何根据请求切换小部件可见性

multithreading - 如何通过调用另一个函数的QThread更新PyQT中的Progressbar