2017-11-18 41 views
1

私はUIデザインのためにQtデザイナーでPython 3.6とPyQt-5.9.1を使用しているアプリで作業しています。いくつかのmatplotlibプロットを含める必要があります。Qt5 Matplotlibデザイナープラグイン

私は、guiの部分(Qtデザイナーから期待されるもの)を更新するたびに、uiファイルから生成されたpythonコードを変更しないために、MatplotlibWidgetプラグインが必要になることを知りました。 Qtデザイナーで

私の問題は、このプラグインで見つかったリファレンスは、Python 2.7をベースにしたPython(x、y)パッケージか、Python 3.xでは動作しないということです。 Python 3.x/Qt5環境で動作していないPyQtdesginerpluginsパッケージ(すでにこの質問で指摘されているHow do I add matplotlib plugin to Qt5.4 Designer plugins?)があります。

Python 3.6およびQt5環境でMatplotlibWidgetをQt Designerに追加する可能性はありますか?これは、アプリケーションロジックからuiを分離する際にQt Designerを最大限に活用するのに多く役立ちます。

+0

利用可能かどうか、そのようなプラグインがある場合、私は考えています。しかし、通常、あなたはそれを必要としません。あなたはちょうどあなたのGUIにいくつかのスペースを残し、コードを介してmatplotlibキャンバス(これはQWidgetです)を追加します。 – ImportanceOfBeingErnest

+0

[この質問](https://stackoverflow.com/questions/46391356/embed-a-matplotlib-graphic-into-a-widget-pyqt5)には、いくつかのUIデザイナーを介して作成された部分と、アプリケーションを実行するコード。前者は操作しませんが、後者にウィジェットを追加します。 – ImportanceOfBeingErnest

+0

プロンプトの返信をありがとう。確かに、これはわずかな余分な作業でこのように動作します。誰かが魔法のqtdesignerプラグインについて知っていない限り、私はその道を行くでしょう。 – Thib

答えて

1

以下は、Qt Designer用のMatplotlibPluginのPyQt5バージョンです。

これを使用するには、PYQTDESIGNERPATH環境変数に含まれるディレクトリ、またはdirectories that Qt Designer searches for its own pluginsのいずれかの "python"サブディレクトリにあるいずれかのディレクトリに両方のファイルを置きます。 2つのファイルの名前は、次のように正確に指定する必要があります。

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' 
+0

ありがとう!あなたが述べたことを試しましたが、MatplotlibウィジェットをQtdesignerインターフェイスに表示することはできません。 – Thib

+0

'PYQTDESIGNERPATH'はどのように設定しましたか?あなたはどんなプラットフォームですか? – ekhumoro

+0

ありがとう!あなたが述べたことを試しましたが、MatplotlibウィジェットをQtdesignerインターフェイスに表示することはできません。 .pyファイルをデザイナーのプラグインディレクトリにコピーし、envt変数を追加しました。 Looks line Qtdesignerは少なくともプラグイン情報ボックスに.dllを入れます。私はプラグイン情報ボックスに入っています。pyqt5.dllのみを表示します。 – Thib

関連する問題