简体   繁体   English

PyQt5 中的鼠标悬停事件

[英]Mouse Hover Event in PyQt5

I want to get the position of mouse while it's hovering over a label.我想在鼠标悬停在标签上时获取鼠标的位置。 I read this but my problem is different.我读了这个,但我的问题是不同的。 I need to grab the mouse position as it hovers over my label without clicking so, mouseMoveEvent doesn't help我需要抓住鼠标位置,因为它悬停在我的标签上而不点击所以,mouseMoveEvent 没有帮助

here's my code:这是我的代码:

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.WindowGUI()
        self.level = "Image Not Loaded Yet"
        self.mouseIsClicked = False
        self.top = 90
        self.left = 90
        self.height = 1800
        self.width = 1800
        self.setGeometry(self.top, self.left, self.height, self.width)
        self.setWindowTitle("Manual Contact Andgle")
        self.setMouseTracking(True)
        mainWidget = QWidget(self)
        self.setCentralWidget(mainWidget)
        mainWidget.setLayout(self.finalVbox)

        self.show()

    def WindowGUI(self):
        self.finalVbox = QVBoxLayout()  # Final Layout
        self.mainHBox = QHBoxLayout()  # Hbox for picLable and Buttons
        self.mainVBox = QVBoxLayout()  # VBox for two Groupboxes
        self.lineVBox = QVBoxLayout()  # VBox For Line Drawing Buttons
        self.fileVBox = QVBoxLayout()  # VBox for file Loading and Saving Buttons
        self.lineGroupbox = QGroupBox("Drawing")  # GroupBox For Line Drawing Buttons
        self.fileGroupbox = QGroupBox("File")  # GroupBox for File Loading and Saving Buttons
        self.picLable = Label(self)  # Lable For showing the Image
        self.piclable_pixmap = QPixmap("loadImage.png")  # Setting Pixmap
        self.picLable.setPixmap(self.piclable_pixmap)  # setting pixmap to piclable
    def mouseMoveEvent(self, QMouseEvent):
        print(QMouseEvent.pos())

If you want to detect the mouse position without pressing on the widget then you must enable mouseTracking that will make the mouseMoveEvent invoked when the mouse is pressed or not, if you want to verify that it is not pressed you must use the buttons() method:如果你想在不按下小部件的情况下检测鼠标位置,那么你必须启用 mouseTracking,这将使 mouseMoveEvent 在鼠标按下或不按下时调用,如果你想验证它没有被按下,你必须使用按钮()方法:

import sys

from PyQt5 import QtWidgets


class Label(QtWidgets.QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setMouseTracking(True)

    def mouseMoveEvent(self, event):
        if not event.buttons():
            print(event.pos())
        super().mouseMoveEvent(event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Label()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

UPDATE:更新:

Mouse events are propagated from children to parents if the children do not consume it, that is, if the child consumes it then the parent cannot consume it.如果孩子不消费鼠标事件,鼠标事件会从孩子传播给父母,也就是说,如果孩子消费了它,那么父母就不能消费它。 So the QLabel is consuming that event so the window will not be notified, so in this case an eventFilter should be used:因此 QLabel 正在消耗该事件,因此不会通知窗口,因此在这种情况下应使用 eventFilter:

import sys

from PyQt5.QtCore import pyqtSignal, pyqtSlot, QEvent, QObject, QPoint
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow


class HoverTracker(QObject):
    positionChanged = pyqtSignal(QPoint)

    def __init__(self, widget):
        super().__init__(widget)
        self._widget = widget
        self.widget.setMouseTracking(True)
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, obj, event):
        if obj is self.widget and event.type() == QEvent.MouseMove:
            self.positionChanged.emit(event.pos())
        return super().eventFilter(obj, event)


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Manual Contact Andgle")

        self.picLable = QLabel(self)
        self.picLable.setPixmap(QPixmap("loadImage.png"))

        hover_tracker = HoverTracker(self.picLable)
        hover_tracker.positionChanged.connect(self.on_position_changed)

    @pyqtSlot(QPoint)
    def on_position_changed(self, p):
        print(p)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM