我正在使用Python 3.6和PyQt-5.9.1使用Qt Designer进行UI设计的应用程序,我需要包含一些matplotlib图。
经过一番挖掘后,我发现每次更新gui部分时都不会修改ui文件生成的python代码(这是Qt Designer的预期),我需要一个MatplotlibWidget插件设置在Qt Designer中。
我的问题是我为这个插件找到的引用来自基于Python 2.7的Python(x,y)包,不适用于Python 3.x;或PyQtdesginerplugins包在Python 3.x / Qt5环境中无效(已在此问题How do I add matplotlib plugin to Qt5.4 Designer plugins?中指出)。
是否有可能在我的Python 3.6和Qt5环境中向Qt Designer添加MatplotlibWidget?这将有助于充分利用Qt Designer将ui与应用程序逻辑隔离开来。
答案 0 :(得分:3)
下面你会找到一个用于Qt Designer的MatplotlibPlugin的PyQt5版本。
要使用它,请将两个文件放在PYQTDESIGNERPATH
环境变量中包含的目录中,或放在" python"其中一个directories that Qt Designer searches for its own plugins内的子目录。这两个文件的名称必须完全如下所示。
<强> matplotlibwidget.py 强>:
from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QSizePolicy
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as Canvas
from matplotlib.figure import Figure
from matplotlib import rcParams
rcParams['font.size'] = 9
class MatplotlibWidget(Canvas):
def __init__(self, parent=None, title='', xlabel='', ylabel='',
xlim=None, ylim=None, xscale='linear', yscale='linear',
width=4, height=3, dpi=100):
self.figure = Figure(figsize=(width, height), dpi=dpi)
self.axes = self.figure.add_subplot(111)
self.axes.set_title(title)
self.axes.set_xlabel(xlabel)
self.axes.set_ylabel(ylabel)
if xscale is not None:
self.axes.set_xscale(xscale)
if yscale is not None:
self.axes.set_yscale(yscale)
if xlim is not None:
self.axes.set_xlim(*xlim)
if ylim is not None:
self.axes.set_ylim(*ylim)
super(MatplotlibWidget, self).__init__(self.figure)
self.setParent(parent)
super(MatplotlibWidget, self).setSizePolicy(
QSizePolicy.Expanding, QSizePolicy.Expanding)
super(MatplotlibWidget, self).updateGeometry()
def sizeHint(self):
return QSize(*self.get_width_height())
def minimumSizeHint(self):
return QSize(10, 10)
<强> matplotlibplugin.py 强>:
import os
from PyQt5.QtGui import QIcon
from PyQt5.QtDesigner import QPyDesignerCustomWidgetPlugin
from matplotlib import rcParams
from matplotlibwidget import MatplotlibWidget
rcParams['font.size'] = 9
class MatplotlibPlugin(QPyDesignerCustomWidgetPlugin):
def __init__(self, parent=None):
super(MatplotlibPlugin, self).__init__(parent)
self._initialized = False
def initialize(self, editor):
self._initialized = True
def isInitialized(self):
return self._initialized
def createWidget(self, parent):
return MatplotlibWidget(parent)
def name(self):
return 'MatplotlibWidget'
def group(self):
return 'PyQt'
def icon(self):
return QIcon(os.path.join(
rcParams['datapath'], 'images', 'matplotlib.png'))
def toolTip(self):
return ''
def whatsThis(self):
return ''
def isContainer(self):
return False
def domXml(self):
return '<widget class="MatplotlibWidget" name="mplwidget">\n' \
'</widget>\n'
def includeFile(self):
return 'matplotlibwidget'
答案 1 :(得分:0)
@Thib。我当时正为同样的问题而苦苦挣扎,但我成功了。正如@ekhumoro所建议的那样,您可以将python文件放置在任何位置,然后将该文件夹添加到环境路径,但是您需要运行Scripts \ pyqt5designer.exe(在python虚拟环境中还是在python安装文件夹中,具体取决于您的安装程序)(如果您使用pyqt5-tools安装了QT Designer,则是根据上面提供的路径完成的。