PyQt5 - горизонтальная полоса прокрутки QTableWidget - PullRequest
0 голосов
/ 24 марта 2020

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

Я выполняется python 3.7, pyqt5.

Вот таблица:

class PlotTable(QTableWidget):

    removed_column = QtCore.pyqtSignal(int)
    update_table = QtCore.pyqtSignal(object)

    def __init__(self, rows=0, columns=0, parent=None):
        QTableWidget.__init__(self, rows, columns, parent)
        self.viewport().installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            item = self.itemAt(event.pos())
            if item is not None and isinstance(item, QTableWidgetItem):
                if event.buttons() == QtCore.Qt.MidButton:
                    col = item.column()
                    self.removeColumn(col)
                    self.removed_column.emit(col)
                elif event.buttons() == QtCore.Qt.LeftButton:
                    self.update_table.emit(item)

        return super().eventFilter(source, event)

Цель - обновить выбор таблицы или удалить столбец из таблицы, в зависимости от типа клика. Я подумал, что, возможно, фильтрация QTableWidgetItem предотвратит случайное обновление полосы прокрутки, но это тоже не работает.

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 25 марта 2020

Полоса прокрутки находится внутри QTableWidget contentsRect, поэтому, когда вы получаете itemAt(event.pos()), она все равно работает, даже если вы нажмете на полосу прокрутки. Вы можете получить геометрию полосы прокрутки и выполнять действия, только если позиция события не находится внутри этой области.

def eventFilter(self, source, event):
    if event.type() == QtCore.QEvent.MouseButtonPress:
        <b>if not self.horizontalScrollBar().geometry().contains(event.pos()):</b>
            item = self.itemAt(event.pos())
            if isinstance(item, QTableWidgetItem):
                if event.buttons() == QtCore.Qt.MidButton:
                    col = item.column()
                    self.removeColumn(col)
                    self.removed_column.emit(col)
                elif event.buttons() == QtCore.Qt.LeftButton:
                    self.update_table.emit(item)

    return super().eventFilter(source, event)

Или вы можете просто переопределить mousePressEvent, который будет игнорировать щелчки на полоса прокрутки по умолчанию.

def mousePressEvent(self, event):
    super().mousePressEvent(event)
    if event.buttons() & QtCore.Qt.MidButton:
        col = self.currentColumn()
        self.removeColumn(col)
        self.removed_column.emit(col)
    elif event.buttons() & QtCore.Qt.LeftButton:
        self.update_table.emit(self.currentItem())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...