PyQt 对话框中的 matplotlib 十字准线光标不显示

Posted

技术标签:

【中文标题】PyQt 对话框中的 matplotlib 十字准线光标不显示【英文标题】:matplotlib crosshair cursor in PyQt dialog does not show up 【发布时间】:2016-04-01 07:45:39 【问题描述】:

我想在我的matplotlib 窗口中的光标上有一个十字准线。这在matplotlib gallery 中给出的示例中得到了解决。但不幸的是,如果我在 Qt 对话窗口 (QDialog) 中有 matplotlib 小部件,它就不起作用。

这是我的代码示例,我想在其中实例化 matplotlib.widgets.Cursor 对象,但没有显示任何内容。

import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor

class Window(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.figure = plt.figure(facecolor='white')
        self.canvas = FigureCanvas(self.figure)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.setLayout(layout)

        ''' plot some random stuff '''
        ax = self.figure.add_subplot(111)
        self.ax = ax
        ax.plot([1,2])

        # Set cursor        
        Cursor(self.ax, useblit=False, color='red', linewidth=1)
        self.canvas.draw()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = Window()
    main.show()
    sys.exit(app.exec_())

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

我已将您的代码修改如下,它可以在我的计算机上运行。希望对您有所帮助。

import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor

class Window(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.figure = plt.figure(facecolor='white')
        self.canvas = FigureCanvas(self.figure)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.setLayout(layout)

        ''' plot some random stuff '''
        ax = self.figure.add_subplot(111)
        self.ax = ax
        ax.plot([1,2])
        # Set cursor        
        cursor = Cursor(self.ax, useblit=False, color='red', linewidth=1)

        ############## The added part: #############
        def onclick(event):
            cursor.onmove(event)
        self.canvas.mpl_connect('button_press_event', onclick)
        ############################################
        self.canvas.draw()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = Window()
    main.show()
    sys.exit(app.exec_())

【讨论】:

【参考方案2】:

(1) 中的原始代码:Cursor(self.ax, useblit=False, color='red', linewidth=1) 没有留下对游标的引用,如文档中所示。

(2)中的代码有赋值,但不是对类引用而是对局部变量:

cursor = Cursor(self.ax, useblit=False, color='red', linewidth=1)

(2) 中的代码与指定的添加一起工作,但光标移动缓慢。

解决方法是(1)中的代码,但修改如下:

self.cursor = Cursor(self.ax, useblit=False, color='red', linewidth=1)

【讨论】:

以上是关于PyQt 对话框中的 matplotlib 十字准线光标不显示的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新嵌入在 PYQT4 中的 MatPlotlib?

PyQt5 应用程序中的 matplotlib 1.4.0 导致分段错误

PyQt5中的Matplotlib:如何去除边缘的小空间

python---- pyqt 十字光标

pyqt 中的多个嵌入式 matplotlib 画布在鼠标悬停时改变大小

输入用户数据时如何更新 Matplotlib 中的绘图(通过 PyQt5 按钮)