PyQt: Как отлавливать события мыши над заголовками QTableWidget? - PullRequest
0 голосов
/ 25 августа 2010

что я хочу сделать, это изменить текст QLable, каждый раз, когда я наводю курсор мыши на горизонтальные заголовки моего QTableWidget.Как я могу это сделать?Каждый раз, когда я нахожусь над новым заголовком, мне нужен сигнал и индекс заголовка.Надеюсь, у кого-то из вас есть идея.Должна быть функция, потому что при наведении курсора на заголовок фон заголовка меняется.

1 Ответ

2 голосов
/ 25 августа 2010

Установите фильтр событий для горизонтального заголовка () с помощью QObject.installEventFilter () :

class HeaderViewFilter(QObject):
    # ...
    def eventFilter(self, object, event):
        if event.type() == QEvent.HoverEvent:
            pass # do something useful
            # you could emit a signal here if you wanted

self. filter = HeaderViewFilter()
horizontalHeader().installEventFilter(self.filter)

При наличии self.filter вы будете уведомлены о необходимых событиях и сможете соответствующим образом реагировать.

ОБНОВЛЕНИЕ : похоже, HoverEvent не совсем то, что нам нужно. Для получения событий при наведении необходимо вызвать setAttribute с помощью Qt::WA_Hover. Из документации по этому атрибуту:

Заставляет Qt генерировать события рисования, когда мышь входит или покидает виджет. Эта функция обычно используется при реализации пользовательских стилей; подробности см. в примере стилей.

Так что да, он генерирует события только при входе или выходе из виджета .

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

class HeaderViewFilter(QObject):
    def __init__(self, parent, header, *args):
        super(HeaderViewFilter, self).__init__(parent, *args)
        self.header = header
    def eventFilter(self, object, event):
        if event.type() == QEvent.MouseMove:
            logicalIndex = self.header.logicalIndexAt(event.pos())
            # you could emit a signal here if you wanted

self.filter = HeaderViewFilter()
self.horizontalHeader = yourView.horizontalHeader()
self.horizontalHeader.setMouseTracking(1)
self.horizontalHeader.installEventFilter(self.filter)

Как вы можете видеть выше, основная концепция все еще применяется. Нам либо нужен фильтр событий, чтобы мы могли следить за событиями, либо нам нужно создать подкласс QHeaderView, чтобы он предоставил нам необходимую информацию.

...