gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:13:22 24 4
gpt4 key购买 nike

我有一个 QWidget包含我想处理的另一个(子)小部件 hoverEnterEventhoverLeaveEvent . The documentation提到

Mouse events occur when a mouse cursor is moved into, out of, or within a widget, and if the widget has the Qt::WA_Hover attribute.



所以我尝试通过设置这个属性并实现相应的事件处理程序来接收悬停事件:
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)对于所有小部件,
  • 包裹 TestWidgetQMainWindow (虽然这不是我想为真正的应用程序做的),
  • 在父小部件和 event.accept() 上实现事件处理程序(虽然据我所知,事件是从内向外传播的,所以这不是必需的)。

  • 如何在我的自定义 QWidgets 上接收悬停事件?

    最佳答案

    QWidget 像 QLabel 一样 没有 hoverEnterEvent hoverLeaveEvent 方法,这些方法来自 QGraphicsItem 所以你的代码不起作用。

    如果您想监听该类型的悬停事件,您必须覆盖 event() 方法:

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


    class TestWidget(QWidget):
    def __init__(self):
    super().__init__()
    layout = QVBoxLayout(self)
    layout.addWidget(TestLabel("Test 1"))
    layout.addWidget(TestLabel("Test 2"))


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

    def event(self, event):
    if event.type() == QEvent.HoverEnter:
    print("enter")
    elif event.type() == QEvent.HoverLeave:
    print("leave")
    return super().event(event)


    def main():
    app = QApplication(sys.argv)
    window = TestWidget()
    window.show()
    sys.exit(app.exec_())


    if __name__ == "__main__":
    main()

    关于python - 如何接收子小部件的悬停事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62224983/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com