Как добавить действие правой кнопки мыши (не меню) в ячейки QTableWidget - PullRequest
0 голосов
/ 04 июня 2018

В настоящее время у меня есть один QTableWidget с разными ячейками.Когда я щелкаю левой кнопкой мыши по ячейке, я хочу, чтобы число на ней увеличивалось на 1, а если я щелкаю правой кнопкой мыши, я хочу, чтобы число уменьшалось на 1.

Для первой части проблем не возникаеткак я использую

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

Проблема возникает с правой кнопкой мыши.Есть ли встроенный метод для этого?Как мне этого добиться?Я попытался создать свой собственный класс Table из QTableWidgets и переопределить mousePressEvent, но не сработал (щелчок по ячейкам ничего не делает, он даже не выделяет ячейки).Также пробовал eventFilter и ничего.Ниже приведен точный код, который я использовал в обеих ситуациях.

Для mousePressEvent:

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)) 

Для eventFilter:

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)
        ...
...

Отладочный текст (печать «влево» или «вправо») также не отображается в консоли.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Когда вы перезаписываете метод, он всегда вызывает метод родителя, поскольку он может выполнять другие виды задач, и вы его пропустите.С другой стороны, если мы сделаем это, делегат будет активирован для редактирования текстов, а это то, что не нужно, поэтому мы создаем нового делегата, который не возвращается ни одним издателем, как показано ниже:

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())
0 голосов
/ 04 июня 2018

Попробуйте:

class Table(QtWidgets.QTableWidget):
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.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.Qt.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)) 
...