【发布时间】:2020-09-25 05:30:21
【问题描述】:
我有一个 QWidget 包含另一个(子)小部件,我想为其处理 hoverEnterEvent 和 hoverLeaveEvent。 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 上接收悬停事件?
【问题讨论】: