【问题标题】:how to track the mouse over the matplot's canvas in QWidget?如何在 QWidget 中的 matplot 画布上跟踪鼠标?
【发布时间】:2019-10-10 12:22:41
【问题描述】:

我想实时跟踪鼠标在 matplot 画布上的位置。

现在,我构建了一个 MplWidget,它继承了 Qwidget(就像一个容器),然后在它上面构建了一个画布来显示绘图。但是,问题是我只能在除画布区域之外的填充区域中跟踪鼠标的位置。

由于我的画布继承了不是 QWidget 的 matplotlib.figure,因此它没有 setMouseTracking() 属性。这样,如何解决这个问题?

我发现了一个非常有用的链接How to return mouse coordinates in realtime?。然而,它也面临同样的问题。当鼠标在标签(文本区域)上时,跟踪功能似乎被中断了。

我的这个类的代码如下所示:

from PyQt5.QtWidgets import *

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

from matplotlib.figure import Figure


class MplWidget(QWidget):

    def __init__(self, parent=None):
        # QWidget.__init__(self, parent)
        super(QWidget, self).__init__(parent)

        self.canvas = FigureCanvas(Figure())

        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)

        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.setLayout(vertical_layout)

        self.setMouseTracking(True)

    def mouseMoveEvent(self, e):
        text = "x: {0},  y: {1}".format(e.x(), e.y())
        print(text)
        super(MplWidget, self).mouseMoveEvent(e)

    def mousePressEvent(self, e):
        print('click!')

【问题讨论】:

    标签: python matplotlib pyqt pyqt5


    【解决方案1】:

    您已经注意到画布不是由 Qt 而是由 matplotlib 处理的,因此解决方案是使用该库提供的事件,如果您查看the docs,您会看到以下事件:

    事件名称 类别和描述

    'button_press_event'  MouseEvent - mouse button is pressed
    'button_release_event'    MouseEvent - mouse button is released
    'draw_event'  DrawEvent - canvas draw (but before screen update)
    'key_press_event' KeyEvent - key is pressed
    'key_release_event'   KeyEvent - key is released
    'motion_notify_event' MouseEvent - mouse motion
    'pick_event'  PickEvent - an object in the canvas is selected
    'resize_event'    ResizeEvent - figure canvas is resized
    'scroll_event'    MouseEvent - mouse scroll wheel is rolled
    'figure_enter_event'  LocationEvent - mouse enters a new figure
    'figure_leave_event'  LocationEvent - mouse leaves a figure
    'axes_enter_event'    LocationEvent - mouse enters a new axes
    'axes_leave_event'    LocationEvent - mouse leaves an axes
    

    在您的情况下,您应该使用事件:

    • button_press_event
    • button_release_event
    • motion_notify_event

    例子:

    from PyQt5 import QtWidgets
    
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    
    
    class MplWidget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(MplWidget, self).__init__(parent)
            self.canvas = FigureCanvas(Figure())
    
            vertical_layout = QtWidgets.QVBoxLayout(self)
            vertical_layout.addWidget(self.canvas)
    
            self.canvas.axes = self.canvas.figure.add_subplot(111)
    
            self.canvas.mpl_connect("button_press_event", self.on_press)
            self.canvas.mpl_connect("button_release_event", self.on_release)
            self.canvas.mpl_connect("motion_notify_event", self.on_move)
    
        def on_press(self, event):
            print("press")
            print("event.xdata", event.xdata)
            print("event.ydata", event.ydata)
            print("event.inaxes", event.inaxes)
            print("x", event.x)
            print("y", event.y)
    
        def on_release(self, event):
            print("release:")
            print("event.xdata", event.xdata)
            print("event.ydata", event.ydata)
            print("event.inaxes", event.inaxes)
            print("x", event.x)
            print("y", event.y)
    
        def on_move(self, event):
            print("move")
            print("event.xdata", event.xdata)
            print("event.ydata", event.ydata)
            print("event.inaxes", event.inaxes)
            print("x", event.x)
            print("y", event.y)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MplWidget()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 非常感谢!这正是我想要的! \n我是 pyqt5 的新手,请问我在哪里可以找到有用且全面的 pyqt5 文档?因为我找不到很多小但可能很重要的东西,比如函数、属性等。再次感谢,抱歉回复晚了
    • @YUNSHENHUANG PyQt5的所有特殊文档都在riverbankcomputing.com/static/Docs/PyQt5,但基础文档是Qt doc.qt.io/qt-5
    • 感谢您的帮助,由于我的声誉低于 15,因此我的投票不会公开显示。但我接受了你的回答。
    • 谢谢。这节省了我剩下的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2021-12-10
    相关资源
    最近更新 更多