PyQt:如何捕获QTableWidget-headers的鼠标悬停事件?

时间:2010-08-25 02:25:22

标签: python header pyqt qtablewidget mousehover

我想要做的是更改QLable的文本,每次我将鼠标悬停在我的QTableWidget的horizo​​ntalHeaders上。我怎样才能做到这一点?每次我在一个新的标题时,我需要一个信号和标题的索引。希望你有人有个主意。必须有一个函数,因为如果将鼠标悬停在标题上,标题的背景会发生变化。

1 个答案:

答案 0 :(得分:2)

使用QObject.installEventFilter()安装在horizo​​ntalHeader()上的事件过滤器:

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到位后,您会收到必要事件的通知,并可以做出相应的回复。

UPDATE :看起来HoverEvent不是我们需要的。要获取悬停事件,您需要使用Qt::WA_Hover调用setAttribute。从该属性的文档:

  

强制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,以便它为我们提供必要的信息。