PyQtGraph не меняет размер - PullRequest
       79

PyQtGraph не меняет размер

1 голос
/ 01 октября 2019

Я пытаюсь сделать простейшее приложение Qt для визуализации некоторых данных, используя pyqtgraph lib. Я создал приложение с одним окном, используя Qt Designer, поместил туда виджет Graphics View и превратил его в pygtgraph. В моем приложении (написанном на python) я создаю тестовый набор данных и строю его. Это работает (график отображается правильно), но график не изменяет размеры с окном. Итак, в Qt Designer я установил макет основной формы на «Layout in a grid», и в предварительном просмотре он работает нормально (виджет «Graphics View» изменяет размеры в главном окне). Но когда я запускаю свое приложение, график выглядит очень маленьким, например, 5x20 пикселей, и его размер нельзя изменить.

Мое приложение:

class AppWindow(QtWidgets.QMainWindow, StartForm.Ui_StartForm):
    def __init__(self):
        super(AppWindow, self).__init__()
        self.setupUi(self)

        line1 = ([1, 3, 2, 4, 6, 5, 3])
        pl = self.graphicsView.plot(line1)  # graphicsView is Graphics View widget from Qt Designer

app = QApplication(sys.argv)
w = AppWindow()
w.show()
sys.exit(app.exec_())

сгенерированный код с помощью Qt Designer:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_StartForm(object):
    def setupUi(self, StartForm):
        StartForm.setObjectName("StartForm")
        StartForm.resize(1609, 1062)
        self.graphicsView = PlotWidget(StartForm)
        self.graphicsView.setGeometry(QtCore.QRect(11, 11, 1261, 931))
        self.graphicsView.setObjectName("graphicsView")

        self.retranslateUi(StartForm)
        QtCore.QMetaObject.connectSlotsByName(StartForm)

    def retranslateUi(self, StartForm):
        _translate = QtCore.QCoreApplication.translate
        StartForm.setWindowTitle(_translate("StartForm", "Form"))


from pyqtgraph import PlotWidget

Я также пытался создать график pyqtgraph из моего приложения на python, а затем внедрить его в пустой макет, сгенерированный Qt Designer, но результат тот же - график не изменяемого размера. Похоже, что он не наследует некоторые свойства от основной формы.

Итак, вопрос в том, почему мой график выглядит очень маленьким (не расширяется до полного окна, как в предварительном просмотре Qt Designer) ине изменяемого размера? Как это исправить?

1 Ответ

1 голос
/ 01 октября 2019

У вас есть 2 ошибки:

  • В зависимости от предоставленного вами кода вы не используете макет.
  • Если вы использовали шаблон «Виджет», то вы должны использовать QWidgetв качестве базового класса вместо этого вы пытаетесь использовать QMainWindow.

Учитывая вышеизложенное, я создал .ui

*. ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>StartForm</class>
 <widget class="QWidget" name="StartForm">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="PlotWidget" name="graphicsView"/>
   </item>
  </layout>
 </widget>
 <customwidgets>
  <customwidget>
   <class>PlotWidget</class>
   <extends>QGraphicsView</extends>
   <header>pyqtgraph</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

Затем вы преобразуете его в .py:

pyuic5 your_form.ui -o StartForm.py -x

, получая следующее:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_StartForm(object):
    def setupUi(self, StartForm):
        StartForm.setObjectName("StartForm")
        StartForm.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(StartForm)
        self.verticalLayout.setObjectName("verticalLayout")
        self.graphicsView = PlotWidget(StartForm)
        self.graphicsView.setObjectName("graphicsView")
        self.verticalLayout.addWidget(self.graphicsView)

        self.retranslateUi(StartForm)
        QtCore.QMetaObject.connectSlotsByName(StartForm)

    def retranslateUi(self, StartForm):
        _translate = QtCore.QCoreApplication.translate
        StartForm.setWindowTitle(_translate("StartForm", "Form"))

from pyqtgraph import PlotWidget
from PyQt5 import QtWidgets
import StartForm

class AppWindow(QtWidgets.QWidget, StartForm.Ui_StartForm):
    def __init__(self):
        super(AppWindow, self).__init__()
        self.setupUi(self)

        line1 = ([1, 3, 2, 4, 6, 5, 3])
        pl = self.graphicsView.plot(line1)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = AppWindow()
    w.show()
    sys.exit(app.exec_())
...