Matplotlib - 导航工具栏快捷方式不起作用

时间:2016-12-28 16:48:51

标签: python qt matplotlib pyqt pyqt4

我在PyQt4 UI中嵌入了matplotlib图。像

这样的东西

Building a matplotlib GUI with Qt Designer.

FigureCanvasQTAgg和NavigationToolbar2QT在QVBoxlayout中添加,UI的右侧是图名的QListWidget。

没有工具栏快捷方式正常工作。我尝试更改QVBoxlayout和QListWidget Widget的焦点。

图生成为

spM2016_CheckColumnExistence_tblM2016

此图传递给addmpl方法,其中生成画布和工具栏并将其添加到主窗口小部件。

from matplotlib.figure import Figure
fig=figure()
ax=fig.add_subplot(111)
ax.plot.plot(np.random.rand(5))

...解决方法

def addmpl(self,fig):
    self.canvas = FigureCanvas(fig)
    self.mplvl.addWidget(self.canvas)
    self.canvas.draw()
    self.toolbar = NavigationToolbar(self.canvas,self.mplwindow)
    self.mplvl.addWidget(self.toolbar)

但像Constrain平移/缩放到x轴这样的快捷方式 - 用鼠标平移/缩放时保持x看起来很难实现。

Question的解决方案存在同样的问题。(将NavigationToolbar2QTAgg替换为NavigationToolbar2QT)

2 个答案:

答案 0 :(得分:2)

如果没有看到您的代码部分在哪里初步显示图形,并且在查看PyQt example之后,我会猜测您还没有配置键盘快捷键:

  1. 确保您拥有from matplotlib.backend_bases import key_press_handler
  2. 将matplotlib图形画布的按键绑定到处理程序:

    self.fig = Figure(...)
    self.canvas = FigureCanvas(self.fig)
    self.mpl_nav_toolbar = NavigationToolbar(...)
    ...
    self.canvas.mpl_connect('key_press_event', self.on_key_press)
    
  3. 配置画布小部件以处理键盘事件:

    ...
    self.canvas.setFocusPolicy(Qt.StrongFocus)
    
  4. 定义您的处理程序以调用key_press_handler:

    def on_key_press(self, event):
        key_press_handler(event, self.canvas, self.mpl_nav_toolbar)
    
  5. 这些步骤也适用于PyQt5,BTW。

答案 1 :(得分:0)

这是特定于PyQt的替代解决方案(已通过PyQt5测试)。它不如mpl_connect('key_press_event'...)简洁,但可以提供更大的灵活性,例如重新定义快捷键。

NavigationToolbar2QT从QToolBar继承,而QToolBar又从QWidget继承。因此,可通过QWidget.actions()获得工具栏上的所有操作。

例如,可以定义全局快捷方式并将其连接以缩放工具栏:

class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        ...        
        self.shortcut = QShortcut(QKeySequence(Qt.Key_Z), self)
        ....

    def addmpl(self, fig):
        ...
        for action in self.toolbar.actions():
            if action.text() == 'Zoom':
                self.shortcut.activated.connect(action.trigger)