Install an event filter that on the horizontalHeader() by using 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)
With self.filter
in place, you'll be notified of the necessary events and can respond accordingly.
UPDATE: it looks like HoverEvent isn't quite what we need. In order to get hover events, you need to setAttribute needs to be called with Qt::WA_Hover
. From the documentation on this attribute:
Forces Qt to generate paint events when the mouse enters or leaves the widget. This feature is typically used when implementing custom styles; see the Styles example for details.
So yes, it generates events only when you enter or leave the widget.
Since the same header is used for all rows or all columns, we'll actually want to know about where the mouse is within the widget. Here's some new code which should handle mouse moves:
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)
As you can see above, the main concept still applies. We either need an event filter so that we can watch for events or we need to subclass QHeaderView
so that it will provide us with the necessary information.