Insertar un gráfico pyqtgraph en un QT .ui?

En primer lugar, espero que tenga algo de paciencia ya que soy nuevo en este tipo de proyectos y también espero no hacer preguntas tontas. Dicho esto, mi objective principal es crear una interfaz de usuario para una Raspberry Pi 3 que detectará el voltaje, la stream, etc. de una batería y de un panel solar.

Ya que estoy trabajando en una raspberry y tengo cierto conocimiento de Python3, decidí usar QTCreator que, según tengo entendido, se puede traducir de python3 a través de pyqt ( https://nikolak.com/pyqt-qt-designer-getting-started/ ). Lo instalé en mi Raspberry Pi e hice la siguiente interfaz de usuario:

después de tener una interfaz de usuario básica, convertí el archivo .ui en .py con el comando pyuic5 y puedo abrir la interfaz de usuario con “python3 main.py” y todo parece correcto:

cómo se ve la interfaz de usuario después de abrir el archivo main.py

Ahora, quiero tener varios gráficos (como voltaje contra tiempo, etc.) en la interfaz de usuario. Estoy usando lo siguiente para la prueba:

import sys import pyqtgraph as pg from pyqtgraph.Qt import QtCore, QtGui import numpy as np pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') win = pg.GraphicsWindow() win.setWindowTitle('pyqtgraph example: Scrolling Plots') p1 = win.addPlot(labels = {'left':'Voltage', 'bottom':'Time'}) data1 = np.random.normal(size=10) data2 = np.random.normal(size=10) curve1 = p1.plot(data1, pen=(3,3)) curve2 = p1.plot(data2, pen=(2,3)) ptr1 = 0 def update1(): global data1, curve1, data2, ptr1 data1[:-1] = data1[1:] # shift data in the array one sample left # (see also: np.roll) data1[-1] = np.random.normal() ptr1 += 1 curve1.setData(data1) curve1.setPos(ptr1,0) data2[:-1] = data2[1:] # shift data in the array one sample left # (see also: np.roll) data2[-1] = np.random.normal() curve2.setData(data2) curve2.setPos(ptr1,0) def update(): update1() timer = pg.QtCore.QTimer() timer.timeout.connect(update) timer.start(2000) # number of seconds (every 1000) for next update if __name__ == '__main__': QtGui.QApplication.instance().exec_() 

¿Es posible incrustar esa ttwig en mi archivo main.py? Si entendí correctamente, se supone que debo usar la funcionalidad de promoción de widgets en QTCreator. Gracias de antemano chicos!

Lo que se promueve a través de Qt Designer es un Widget, es decir, una clase, por lo que no se puede promover directamente, lo que debemos hacer es colocarlo dentro de una clase como se muestra a continuación:

Plotter.py

 class CustomWidget(pg.GraphicsWindow): pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') ptr1 = 0 def __init__(self, parent=None, **kargs): pg.GraphicsWindow.__init__(self, **kargs) self.setParent(parent) self.setWindowTitle('pyqtgraph example: Scrolling Plots') p1 = self.addPlot(labels = {'left':'Voltage', 'bottom':'Time'}) self.data1 = np.random.normal(size=10) self.data2 = np.random.normal(size=10) self.curve1 = p1.plot(self.data1, pen=(3,3)) self.curve2 = p1.plot(self.data2, pen=(2,3)) timer = pg.QtCore.QTimer(self) timer.timeout.connect(self.update) timer.start(2000) # number of seconds (every 1000) for next update def update(self): self.data1[:-1] = self.data1[1:] # shift data in the array one sample left # (see also: np.roll) self.data1[-1] = np.random.normal() self.ptr1 += 1 self.curve1.setData(self.data1) self.curve1.setPos(self.ptr1, 0) self.data2[:-1] = self.data2[1:] # shift data in the array one sample left # (see also: np.roll) self.data2[-1] = np.random.normal() self.curve2.setData(self.data2) self.curve2.setPos(self.ptr1,0) if __name__ == '__main__': w = CustomWidget() w.show() QtGui.QApplication.instance().exec_() 

Antes de continuar, asumiré que los archivos tienen la siguiente estructura:

 . ├── main.py └── Plotter.py 
  1. Lo primero que debes hacer es elegir el widget:

introduzca la descripción de la imagen aquí

  1. Luego hacemos clic derecho sobre esto y elegimos la opción para promocionar a … :

introduzca la descripción de la imagen aquí

  1. En el cuadro de diálogo, colocamos CustomWidget en Nombre de clase promocionado y Plotter.h en Archivo de encabezado , luego presionamos el botón Agregar y Promover .

introduzca la descripción de la imagen aquí

  1. Luego convertimos nuestro archivo .ui a .py

introduzca la descripción de la imagen aquí