3

我正在尝试使用嵌入式 matplotlib 图最大限度地利用 Qt GUI 中的空间,包括标准的 matplotlib 导航栏,以为用户提供有用的功能(缩放、保存、移动等)

不幸的是,当绘图窗口具有“宽屏”比例时,导航栏最终会占用大量空间,如下所示。所有按钮都在左侧,但 NavigationBar 也会创建一整条空白区域。 在此处输入图像描述

虽然我的预期应用程序是在 Qt GUI 中嵌入 matplotlib 图,但我相信这是一个普遍问题,也可能适用于默认 matplotlib ax.plot 操作显示的标准图。

可以使用这个空间吗?我尝试在这里设置文本和 mpl 小部件,但它们总是隐藏在导航栏后面。也许有一个设置可以使这个栏的颜色透明?

或者,是否有一种快速方法可以将按钮作为小部件添加到我的图形上,因此不需要 NavigationBar。我喜欢该栏提供的样式和功能,因此不必手动重新实现每一个。

谢谢。

4

1 回答 1

2

NavigationToolbar是正常的QWidget。这意味着您可以用它做所有您也可以用其他小部件做的事情,包括

  • 将其放入其他小部件的布局中
  • 将其放入菜单
  • 改变它的布局
  • 将其绝对定位在 GUI 内
  • ETC...

这个问题有点过于宽泛,无法为所有这些提供解决方案;但是对于如何在 PyQt 中操作和定位小部件,也有足够的资源可用。

下面是一个绝对定位的示例NavigationToolbar,它(默认情况下)是透明的。工具栏位于轴的原点,如果调整图形大小,工具栏将保留在那里。

带有透明导航工具栏的 GUI

import matplotlib.pyplot as plt
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar

class Window(QtGui.QMainWindow):
    def __init__(self, fig):
        self.qapp = QtGui.QApplication([])

        QtGui.QMainWindow.__init__(self)
        self.widget = QtGui.QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(QtGui.QVBoxLayout())
        self.widget.layout().setContentsMargins(0,0,0,0)
        self.widget.layout().setSpacing(0)

        self.fig = fig
        self.canvas = FigureCanvas(self.fig)
        self.canvas.draw()
        self.canvas.mpl_connect("resize_event", self.resize)

        self.widget.layout().addWidget(self.canvas)

        self.nav = NavigationToolbar(self.canvas, self.widget, coordinates=False)
        self.nav.setMinimumWidth(300)
        self.nav.setStyleSheet("QToolBar { border: 0px }")

        self.show()
        self.qapp.exec_()

    def resize(self, event):
        # on resize reposition the navigation toolbar to (0,0) of the axes.
        x,y = self.fig.axes[0].transAxes.transform((0,0))
        figw, figh = self.fig.get_size_inches()
        ynew = figh*self.fig.dpi-y - self.nav.frameGeometry().height()
        self.nav.move(x,ynew)

# create a figure with a subplot
fig, ax = plt.subplots(figsize=(5,3))
# colorize figure and axes to make transparency obvious
fig.set_facecolor("#e9c9ef") 
ax.set_facecolor("#f7ecf9")
ax.plot([2,3,5,1], color="#ab39c1")
fig.tight_layout()

# pass the figure to the custom window
a = Window(fig)
于 2017-05-29T23:24:35.580 回答