【问题标题】:PyQt: How to catch mouse-over-event of QTableWidget-headers?PyQt:如何捕获 QTableWidget-headers 的鼠标悬停事件?
【发布时间】:2010-08-25 02:25:21
【问题描述】:

每次我将鼠标悬停在我的 QTableWidget 的水平标题上时,我想要做的是更改 QLable 的文本。我怎样才能做到这一点?每次我通过一个新的标题时,我都需要一个信号和标题的索引。希望你们中的某个人有一个想法。必须有一个函数,因为如果你将鼠标悬停在标题上,标题的背景就会改变。

【问题讨论】:

    标签: python header pyqt qtablewidget mousehover


    【解决方案1】:

    使用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,您将收到必要事件的通知并做出相应的回应。

    更新:看起来 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 以便它为我们提供必要的信息。

    【讨论】:

    • 再次感谢K.P.。我会试试的。
    • 我试过了,但还是有问题。如果光标悬停在水平标题栏上,我只会得到一个 QHeaderView。如果我将鼠标悬停在标题上,我不会收到任何 HoverEnter 事件。只有当我第一次进入标题栏时。能否请您再给我一个提示。
    • 我刚刚添加了一些代码来演示如何使用鼠标移动事件。
    • 太棒了! logicalIndexAt(event.pos()) 是我正在寻找的。现在它起作用了。非常感谢。
    • @xinor - 顺便说一句,无论您是否接受答案,您都应该投票(通过使用向上箭头)您认为有用的任何答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2016-02-20
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多