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

2024-04-26 06:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pyqt4ui中嵌入了一个matplotlib图形。有点像

Building a matplotlib GUI with Qt Designer.

FigureCanvasQTAgg和NavigationToolbar2QT被添加到QVBoxlayout中,UI右侧是一个图形名称的QListWidget。在

工具栏快捷方式都不起作用。我尝试改变QVBoxlayout和QListWidget小部件的焦点。在

图形生成为

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

这个图被传递到addmpl方法,在这里生成画布和工具栏并添加到主窗口小部件中。在

^{pr2}$

解决方法。。。在

def menu(self):
    self.savefig=QtGui.QAction('&Save', self) 
    self.savefig.setShortcut('Ctrl+S')
    self.savefig.triggered.connect(self.save_figure)

    undo=QtGui.QAction('&Undo', self)
    undo.setShortcut('Ctrl+Z')
    undo.triggered.connect(self.back)

    redo=QtGui.QAction('&Redo', self)
    redo.setShortcut('Ctrl+Y')
    redo.triggered.connect(self.forward)

    figoptions=QtGui.QAction('&Figure Options', self)
    figoptions.setShortcut('Ctrl+F')
    figoptions.setStatusTip('Edit curves lines and axes parameters')
    figoptions.triggered.connect(self.edit_parameters)



def back(self):
    self.toolbar.back()
def forward(self):
    self.toolbar.forward()
def save_figure(self):
    self.toolbar.save_figure()
def edit_parameters(self):
    self.toolbar.edit_parameters()

但是像“约束平移/缩放到x轴-用鼠标平移/缩放时按住x轴”这样的快捷方式看起来既困难又乏味。在

Question的解决方案也有相同的问题。(将NavigationToolbar2QTAgg替换为NavigationToolbar2QT)


Tags: self图形matplotlibdefconnectfigureparametersctrl
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. 定义处理程序以调用按键处理程序:

    def on_key_press(self, event):
        key_press_handler(event, self.canvas, self.mpl_nav_toolbar)
    

顺便说一句,这些步骤也适用于PyQt5

这是一种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)

相关问题 更多 >