es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo reemplazar un Widget de OpenGL en un diseño QT?

Creé una ventana en Qt Designer y agregué un widget de OpenGL como widget principal de visualización.
En mi código principal, ahora quiero intercambiar este widget de OpenGL con un pyqtgraph.OpenGl.GlViewWidget, pero el comportamiento original se pierde cuando lo hago de esta manera:

“`html

<h1>Código generado por Qt Designer</h1>

class UiMainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(1282, 721)
self.closeApplication = QAction(MainWindow)
self.closeApplication.setObjectName(u"closeApplication")

<pre><code> self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.horizontalLayout_2 = QHBoxLayout(self.centralwidget)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.graphicsView = QOpenGLWidget(self.centralwidget)
self.graphicsView.setObjectName(u"graphicsView")

self.horizontalLayout_2.addWidget(self.graphicsView)
</code></pre>

<h1>Mi script Main.py</h1>

from PySide2.QtWidgets import *<br>
import pyqtgraph.opengl as gl<br>
from PySide2.QtGui import *

class RegistrationApp(QMainWindow, Ui_MainWindow):
def <strong>init</strong>(self):

<pre><code> super().__init__()
self.setupUi(self)
self.setWindowIcon(QIcon(r"./icon.PNG"))
self.horizontalLayout_2.removeWidget(self.graphicsView)
self.graphicsView = gl.GLViewWidget(self.centralwidget)
self.graphicsView.setObjectName(u"graphicsView")
self.graphicsView.setGeometry(QRect(9, 9, 933, 620))
self.graphicsView.opts['distance'] = 200
self.graphicsView.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
self.horizontalLayout_2.addWidget(self.graphicsView)
</code></pre>

“`html

Todo funciona como se espera cuando lo cambio en la clase Ui_MainWindow, pero esto va en contra de la idea de Qt Designer, ya que tengo que cambiarlo cada vez que hago un cambio en el archivo de interfaz de usuario.
¿Hay alguna forma de reemplazar el widget original?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de reemplazar el widget original OpenGL sin modificar el código generado por Qt Designer. Una opción es promocionar el widget OpenGL existente a un widget personalizado que hereda de pyqtgraph.OpenGl.GlViewWidget.

    Para hacerlo, siga estos pasos:
    1. En Qt Designer, seleccione el widget OpenGL y vaya a la sección de Widgets Promovidos en el Inspector de Objetos.
    2. Haga clic en el botón Agregar… y complete los campos Nombre de Clase Promovida (por ejemplo, CustomOpenGLWidget), Archivo de Encabezado (por ejemplo, customwidget.py) y Nombre de Clase Promovida (por ejemplo, pyqtgraph.OpenGl.GlViewWidget).
    3. Guarde el archivo .ui y genere el código Python como de costumbre.
    4. En su código principal, importe la clase de widget personalizado (from customwidget import CustomOpenGLWidget) y úsela en lugar del widget original.

    Aquí hay un ejemplo de cómo se vería el código principal:

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import pyqtgraph.opengl as gl
    from customwidget import CustomOpenGLWidget  # importe la clase de widget personalizado
    
    class RegistrationApp(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.setWindowIcon(QIcon(r"./icon.PNG"))
    
            # reemplace el widget original con el widget personalizado
            self.opengl_widget = CustomOpenGLWidget(self.centralwidget)
            self.opengl_widget.setObjectName("graphicsView")
            self.horizontalLayout_2.replaceWidget(self.graphicsView, self.opengl_widget)
            self.graphicsView.setParent(None)
    
            # configure propiedades para el widget personalizado
            self.opengl_widget.opts['distance'] = 200
            self.opengl_widget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
            self.opengl_widget.setGeometry(QRect(9, 9, 933, 620))
    

    Tenga en cuenta que primero creamos una instancia del widget personalizado (self.opengl_widget = CustomOpenGLWidget(self.centralwidget)) y luego lo reemplazamos por el widget original (self.horizontalLayout_2.replaceWidget(self.graphicsView, self.opengl_widget)). El widget original se elimina de su padre con self.graphicsView.setParent(None).

    Después de eso, podemos configurar las propiedades deseadas para el widget personalizado (self.opengl_widget.opts['distance'] = 200, self.opengl_widget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred), etc.)

Comments are closed.