pyqtgraph с PySide 2 и QtDesigner - PullRequest
       27

pyqtgraph с PySide 2 и QtDesigner

0 голосов
/ 07 марта 2020

Является ли функция «Повышать до…», которая описана в документации pyqtgraph 0.10.0:

http://www.pyqtgraph.org/documentation/how_to_use.html#embedding -widgets-inside-pyqt-Applications

также работает с PySide2 и недавно разработанной веткой pyqtgraph? Когда я создаю .ui-файл с помощью QtDesigner и следую инструкциям «Повысить до ...», pyqtgraph не отображается в виджете:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys

from PySide2 import QtWidgets, QtUiTools, QtCore
import pyqtgraph as pg


def load_ui(fname):
    fd = QtCore.QFile(fname)
    fd.open(QtCore.QFile.ReadOnly)
    loader = QtUiTools.QUiLoader()
    window = loader.load(fd)
    fd.close()
    return window


class First:
    def __init__(self):
        self.window = load_ui('test.ui')

    def show(self):
        self.window.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    main = First()  
    main.show()

    sys.exit(app.exec_())

С PyQt5 и pyqtgraph 0.10.0 это действительно работает: виджет будет отображаться как пустой график Pyqtgraph.

Редактировать:

Вот код test.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="PlotWidget" name="Graph">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>20</y>
      <width>701</width>
      <height>501</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>PlotWidget</class>
   <extends>QGraphicsView</extends>
   <header>pyqtgraph</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

1 Ответ

0 голосов
/ 11 марта 2020

PySide2 работает только для ветви разработки, поэтому вам придется установить ее:

git clone -b develop git@github.com:pyqtgraph/pyqtgraph.git
python setup.py install

С другой стороны, QUiLoader не знает PlotWidget, поэтому вам необходимо переопределить метод createWidget:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import sys

from PySide2 import QtWidgets, QtUiTools, QtCore
import pyqtgraph as pg

DIR_PATH = os.path.dirname(os.path.realpath(__file__))


class UiLoader(QtUiTools.QUiLoader):
    def createWidget(self, className, parent=None, name=""):
        if className == "PlotWidget":
            return pg.PlotWidget(parent=parent)
        return super().createWidget(className, parent, name)


def load_ui(fname):
    fd = QtCore.QFile(fname)
    if fd.open(QtCore.QFile.ReadOnly):
        loader = UiLoader()
        window = loader.load(fd)
        fd.close()
        return window


class First:
    def __init__(self):
        self.window = load_ui(os.path.join(DIR_PATH, "test.ui"))

    def show(self):
        self.window.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())
...