PlotWidget в QWidget

в гуи на Pyside2 нужно добавить график. Для построения графика использую pyqtgraph.

    self.page_3 = QtWidgets.QWidget()
    self.page_3.setObjectName("page_3")
    self.toolBox.addItem(self.page_3, "Визуализация")

    self.graphWidget = pg.PlotWidget()

    self.layout = QtWidgets.QFormLayout()
    self.layout.addWidget(self.graphWidget)
    self.groupBox3 = QtWidgets.QGroupBox()
    self.groupBox3.setLayout(self.layout)

выдает ошибку

TypeError: 'PySide2.QtWidgets.QLayout.addWidget' called with wrong argument types:
PySide2.QtWidgets.QLayout.addWidget(PlotWidget)
Supported signatures:
PySide2.QtWidgets.QLayout.addWidget(PySide2.QtWidgets.QWidget)

Как мне тогда добавить виджет с графиком?


Ответы (1 шт):

Автор решения: S. Nick

Так как вы не предоставили воспроизводимый пример, я продемонстрирую как рисовать график в реальном времени, не блокируя графический интерфейс.

Поменяйте импорты под PySide2, так как у меня PyQt5 и попробуйте.

import sys
import pyqtgraph as pg
import numpy as np

from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGroupBox, QGridLayout, \
    QLabel, QLineEdit, QApplication
from PyQt5.QtCore import QThread, pyqtSignal


class MyThread(QThread):
    signal = pyqtSignal(object)

    def __init__(self, parent=None):
        super().__init__()
        self.s  = None    
        self.phase = 0    

    def run(self):
        for i in range(100):                    
            self.update()
            self.signal.emit(self.s) 
            self.msleep(200)             

    def update(self):
        self.t = np.arange(0, 3.0, 0.01)
        self.s = np.sin(2 * np.pi * self.t + self.phase)    
        self.phase += 0.1
        

class Window(QDialog):
    def __init__(self):
        super().__init__()

        self.gridLayoutCreation()
        
        vboxLayout = QVBoxLayout()
        vboxLayout.addWidget(self.groupBox)
        self.setLayout(vboxLayout)

        self.traces = dict()
        pg.setConfigOptions(antialias=True)        

    def gridLayoutCreation(self): 
        self.groupBox = QGroupBox("Пример компоновки Grid Layout")
        gridLayout   = QGridLayout()
        self.guiplot = pg.PlotWidget()
        gridLayout.addWidget(self.guiplot, 0, 8, 8, 12)
        self.groupBox.setLayout(gridLayout)

        gridLayout.addWidget(QLabel('Label'), 0,0)
        self.timeEdit = QLineEdit('Hello World') 
        gridLayout.addWidget(self.timeEdit, 1,0) 

    def plotar(self, s):                                    
        self.guiplot.clear()
        self.guiplot.plot(s)

    def test(self):
        self.thread = MyThread()
        self.thread.signal.connect(self.displayS)
        self.thread.start()

    def displayS(self, self_s):                             
        """ Рисуйте график в реальном времени, не блокируя графический интерфейс.
        """
        self.plotar(self_s)


if __name__ == '__main__':
    app = QApplication(sys.argv)  
    w = Window()
    w.show()
    w.test()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка