我在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)
答案 0 :(得分:2)
如果没有看到您的代码部分在哪里初步显示图形,并且在查看PyQt example之后,我会猜测您还没有配置键盘快捷键:
from matplotlib.backend_bases import key_press_handler
将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)
配置画布小部件以处理键盘事件:
...
self.canvas.setFocusPolicy(Qt.StrongFocus)
定义您的处理程序以调用key_press_handler:
def on_key_press(self, event):
key_press_handler(event, self.canvas, self.mpl_nav_toolbar)
这些步骤也适用于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)