PyQt: 如何捕获QTableWidget头部的鼠标悬停事件?

0 投票
1 回答
5599 浏览
提问于 2025-04-16 03:15

我想做的是,每当我把鼠标放在QTableWidget的水平标题上时,改变一个QLable的文本。请问我该怎么做呢?每次我移动到一个新的标题上时,我需要一个信号和这个标题的索引。希望你们中的某个人能给我个主意。应该有个函数,因为当你把鼠标放在标题上时,标题的背景会改变。

1 个回答

2

安装一个事件过滤器,用来监控横向标题(horizontalHeader()),可以通过使用 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 以便获取所需的信息。

撰写回答