2015-05-14 157 views
1

我正在使用PyQt4中包含通过使用2D阵列matplotlib的imshow显示图像的GUI。如果我用pyplot显示它,如果将鼠标移动到图像上,窗口将显示光标的x,y坐标。但是,当我将imshow嵌入到pyqt GUI中时,这似乎消失了。有没有一种方法可以让鼠标事件调用某个函数,该函数会返回鼠标悬停点的x,y坐标(或者更好,还有那个二维数组的索引)?matplotlib GUI imshow坐标

编辑:我找到了wx的文档,但我仍然不知道如何为我的GUI做到这一点。 wxcursor_demo

如果有帮助,这里是我如何嵌入imshow情节。首先,我创建一个基画布类,然后从该我创建一个类用于imshow:

class Canvas(FigureCanvas): 
    def __init__(self, parent = None, width = 5, height = 5, dpi = 100, projection = None): 
     self.fig = Figure(figsize = (width, height), dpi = dpi) 
     if projection: 
      self.axes = Axes3D(self.fig) 
     else: 
      self.axes = self.fig.add_subplot(111) 

     self.axes.tick_params(axis = 'both', which = 'major', labelsize = 8) 
     self.axes.tick_params(axis = 'both', which = 'minor', labelsize = 8) 
     self.compute_initial_figure() 
     FigureCanvas.__init__(self, self.fig) 
     self.setParent(parent) 
     FigureCanvas.setSizePolicy(self, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 
     FigureCanvas.updateGeometry(self) 

    def compute_initial_figure(self): 
     pass 

class TopView(Canvas): 
    def __init__(self, *args, **kwargs): 
     Canvas.__init__(self, *args, **kwargs) 
     self.divider = make_axes_locatable(self.axes) 
     self.cax = self.divider.append_axes("bottom", size = "5%", pad = 0.2) 

    def compute_initial_figure(self): 
     self.top = self.axes.imshow(zarr, interpolation = 'none', extent = [xmin, xmax, ymin, ymax], origin = 'lower') 
     self.top.set_cmap('nipy_spectral') 
     self.top.set_clim(vmin = pltMin, vmax = pltMax) 

然后,在主窗口中,我创建对象,并将其放置在网格布局:

tv = TopView(self.main_widget, width = 4, height = 3, dpi = 100) 
self.g.addWidget(tv, 1, 2, 3, 1) 

回答

1

Matplotlib使用自己的事件,以便它们独立于UI工具包(wx-windows,Qt等)。因此wxcursor_demo很容易适应Qt,就像你的情况一样。

首先将下面一行添加到您的Canvas类的构造函数

self.mpl_connect('motion_notify_event', self.mouse_moved) 

这会在每次鼠标在移动时调用MOUSE_MOVED方法。

mouse_moved方法可以发出连接到它知道如何显示鼠标坐标的插件一个Qt信号。事情是这样的:

def mouse_moved(self, mouse_event): 
    if mouse_event.inaxes: 
     x, y = mouse_event.xdata, mouse_event.ydata 
     self.mouse_moved_signal.emit(x,y) 

当然,你必须在Canvas构造函数定义mouse_moved_signal为好。请注意,mouse_event参数是一个Matplotlib event,而不是Qt事件。

我建议你Matplotlib文档中读取chapter about events了解什么是可能的。