如何接收子小部件的悬停事件?

问题描述 投票:4回答:2

我有一个QWidget,其中包含另一个我要处理hoverEnterEventhoverLeaveEvent的(子)窗口小部件。 The documentation提到

鼠标事件移入,移出窗口小部件或在窗口小部件内时,如果窗口小部件具有Qt::WA_Hover属性,则会发生鼠标事件。

因此,我尝试通过设置此属性并实现相应的事件处理程序来接收悬停事件:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout

class TestWidget(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        layout.addWidget(TestLabel('Test 1'))
        layout.addWidget(TestLabel('Test 2'))
        self.setLayout(layout)
        self.setAttribute(Qt.WA_Hover)

class TestLabel(QLabel):
    def __init__(self, text):
        super().__init__(text)
        self.setAttribute(Qt.WA_Hover)

    def hoverEnterEvent(self, event):  # this is never invoked
        print(f'{self.text()} hover enter')

    def hoverLeaveEvent(self, event):  # this is never invoked
        print(f'{self.text()} hover leave')

    def mousePressEvent(self, event):
        print(f'{self.text()} mouse press')

app = QApplication([])
window = TestWidget()
window.show()
sys.exit(app.exec_())

但是似乎不起作用,没有收到悬停事件。另一方面,mousePressEvent确实起作用。

此外,我还尝试了以下操作:

  • 为所有小部件设置self.setMouseTracking(True)
  • TestWidget包装在QMainWindow中(尽管这不是我想要为实际应用程序执行的操作,],>
  • 在父窗口小部件和event.accept()上实施事件处理程序(尽管据我所知,事件是从内向外传播的,因此这不是必需的。)>
  • 如何在自定义QWidget上接收悬停事件?

我有一个QWidget,其中包含另一个我要处理hoverEnterEvent和hoverLeaveEvent的(子)窗口小部件。该文档提到鼠标事件在移动鼠标光标时发生...

python pyqt pyqt5 qlabel
2个回答
3
投票

[Q0Cel的QWidget会[[0]和QWidget方法,[这些没有]],这些方法来自hoverEnterEvent,因此您的代码不起作用。

如果要侦听类型的悬停事件,则必须重写hoverEnterEvent方法:

2
投票
您知道您可以使用QWidget的enterEvent和离开事件来做到这一点吗?您需要做的就是更改方法名称。您甚至不需要在标签上设置“悬停”属性。

hoverLeaveEvent

© www.soinside.com 2019 - 2024. All rights reserved.