【问题标题】:how to emit (fire) axes_leave_event如何发射(发射)axes_leave_event
【发布时间】:2012-01-11 19:23:53
【问题描述】:

这是我关于stackoverflow的第一个问题!我有一个显示 mpl 图形画布的 PyQT gui。我已将主轴周围的边距设置为 0,因此绘图将完全填充图形画布和包含它的小部件。问题是当我这样做时,当我离开图形画布时,我不再得到axes_leave_event。例如,当我单击mpl_toolbar 中的平移按钮时,我的光标变为十字箭头,但是当我离开小部件时,我希望它恢复正常并在我重新进入时返回十字箭头小部件。如果我不最小化我在轴周围的边距,那么它就像我想要的那样工作。我也可以连接axes_leave_event,但我不想连接它我想发出它但不知道该怎么做。

非常感谢。

我的应用程序相当大,所以我只显示我认为最相关的代码。

    def create_main_frame(self):
        self.dpi = 100
        self.fig = Figure((5.0, 4.0), dpi=self.dpi)
        self.fig.subplots_adjust(left = 0, right=1, top=1, bottom=0)
        self.map_canvas = MyDiagram(self.fig)
        
        self.add_axis()
           
        self.mpl_toolbar = NavigationToolbar(self.map_canvas, None)
        self.layout().addWidget(self.map_canvas)  


class MyDiagram(FigureCanvas):
    def __init__(self, fig):
        FigureCanvas.__init__(self, fig)
        self.mpl_connect('axes_leave_event', self.testing)
    def resizeEvent(self, event):
        if not event.size().height() == 0:
            FigureCanvas.resizeEvent(self, event)

    def testing(self, event):
        pass

    def leaveEvent(self, event):
        FigureCanvas.leaveEvent(self, event)
        #If I could somehow get the 'axes_leave_event' to fire right here I would be set.

【问题讨论】:

  • 如果你不打算连接到axes_leave_event,那么发出它有什么意义?
  • 当事件触发时,它会将您的光标更改为图表光标或从图表光标更改为应用程序光标。我希望发生这种情况,但在我的图表最大化的情况下,事件不会发生。基本上我要离开画布而不会离开轴。我想在我离开图形时欺骗轴离开事件。
  • 但是axes_leave_event 是一个通知:它传递一个已经发生的事件,而不是创建它。为了发出它,您需要创建相关的 mpl 事件(这与传递给 leaveEvent 的 Qt 事件不同)。使用MyDiagram.enterEventMyDiagram.leaveEvent 自己更新光标可能会更容易。
  • 您的建议也是我最初的想法,但我想不通。在 leaveEvent 我添加了 QtGui.QApplication.restoreOverrideCursor() 这很好用,但是我会在 enterEvent 中添加什么以根据工具栏上的检查内容恢复适当的光标?

标签: python pyqt matplotlib


【解决方案1】:

这在某种程度上是基于猜测,因为我无法使用 matplotlib 对其进行测试,但类似的方法可能会起作用:

class MyDiagram(FigureCanvas):
    def __init__(self, fig):
        FigureCanvas.__init__(self, fig)
        self._cursor = None

    def enterEvent(self, event):
        if (self._cursor is not None and
            QApplication.overrideCursor() is None):
            QApplication.setOverrideCursor(self._cursor)
        FigureCanvas.enterEvent(self, event)

    def leaveEvent(self, event):
        self._cursor = QCursor(QApplication.overrideCursor())
        QApplication.restoreOverrideCursor()
        FigureCanvas.leaveEvent(self, event)

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 2018-10-20
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2016-07-11
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多