Контекстное меню открывается, когда оно не должно (если ... elif) - PullRequest
0 голосов
/ 06 июня 2018

У меня есть QTableWidget с 8 столбцами, и я хочу, чтобы контекстное меню открывалось только в первом (столбец 0), поскольку в остальных столбцах я использую правый щелчок для другого действия.

Когда я впервые запускаю программу, все работает как надо: если я сначала щелкну правой кнопкой мыши в ячейке столбца 3, например, она сделает то, что должна (вычесть 1 из значения ячейки), и не откроет контекстное меню,perfect.

НО после того, как я сначала щелкну правой кнопкой мыши по столбцу 0, чтобы открыть контекстное меню (оно работает нормально), если я вернусь к столбцу 3 и щелкну правой кнопкой мыши ... Откроется контекстное меню!И он также выполняет действия, которые он должен (вычитая из значения ячейки)!

Вот код, который я использую:

class Table(QtWidgets.QTableWidget):
            cellExited = QtCore.pyqtSignal(int, int)
            itemExited = QtCore.pyqtSignal(QtWidgets.QTableWidgetItem)

    def __init__(self,*args,**kwargs):
            QtWidgets.QTableWidget.__init__(self,*args,**kwargs)
            self.setItemDelegate(ReadOnlyDelegate(self))
            self._last_index = QtCore.QPersistentModelIndex()
            self.viewport().installEventFilter(self)
            self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)

            self.popMenu = QtWidgets.QMenu(self)
            self.popMenu.addAction(QtWidgets.QAction('Action 1', self))
            self.popMenu.addAction(QtWidgets.QAction('Action 2', self))
            self.popMenu.addAction(QtWidgets.QAction('Action 3', self))

    def mousePressEvent(self,event):
        it = self.itemAt(event.pos())
        print(it.column())    #DEBUG
        if it.column()>0:
            if event.button() == QtCore.Qt.LeftButton:
                it.setText(str(round(float(it.text()) + 1,2)))
            elif event.button() == QtCore.Qt.RightButton:
                it.setText(str(round(float(it.text()) - 1,2)))
        elif it.column() == 0 and event.button() == QtCore.Qt.RightButton:
            print(it.column() == 0)    #DEBUG
            print(event.button() == QtCore.Qt.RightButton)    #DEBUG        
            self.customContextMenuRequested.connect(self.on_context_menu)

    def on_context_menu(self, point):
        self.popMenu.exec_(self.viewport().mapToGlobal(point))

Ответы [ 2 ]

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

Подключение обработчика события (on_context_menu) к событию (customContextMenuRequested) в другом обработчике события (mousePressEvent) кажется неортодоксальным.

Вместо этого вы можете подключить события в методе __init__,Это означает перемещение self.customContextMenuRequested.connect(self.on_context_menu) в __init__.Затем в on_context_menu вы должны проверить, для чего запрашивалось контекстное меню, и показывать его, только если это первый столбец:

def on_context_menu(self, point):
    # the ... should be replaced by code that gets the column on which the event occurred
    column == ...
    if column == 0:
        self.popMenu.exec_(self.viewport().mapToGlobal(point))

(на самом деле я не знаю, как получить столбец внутри on_context_menu)

Затем внутри mousePressEvent вам больше не нужна вся elif часть.

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

self.customContextMenuRequested.connect(self.on_context_menu) означает, что вы подключаете событие customContextMenuRequested к методу self.on_context_menu.Каждый раз, когда происходит событие (возможно, каждый раз при щелчке правой кнопкой мыши), метод вызывается.

При первом щелчке правой кнопкой мыши по столбцу 0 событие подключается к методу.После этого каждый щелчок правой кнопкой будет вызывать метод.

То, что вы хотите, - это прямой вызов self.on_context_menu, например:

def mousePressEvent(...):
   ....
   elif it.column() == 0 ... :
        self.on_context_menu()
...