Personalizando código de Qt widget de diseño?

Necesito agregar algunas características a un widget de gráficos en una forma que creé usando el Diseñador Qt.

Por ejemplo, normalmente haría algo como esto:

class custom_gv(QGraphicsView): def __init__(self): super().__init__() def zoom(self): # custom code here 

Pero en este caso, la vista de gráficos es una parte de la ventana que hice en Qt Designer. Sé que puede usar la función “promocionar a” en el diseñador de Qt, pero no sé cómo usar eso en el código, especialmente considerando que uso este método para usar las ventanas del Diseñador de Qt:

 from PyQt5.uic import loadUiType custom_window = loadUiType('ui.ui') class Window(QMainWindow, custom_window): def __init__(self): QMainWindow.__init__(self) custom_window.__init__(self) self.setupUi(self) 

Entonces, ¿cómo puedo personalizar el código de la vista de gráficos en mi ventana cuando uso Qt Designer?

La forma más común de resolver esto es mediante la promoción de widgets . Esto le permitirá reemplazar un widget definido en Qt Designer con su propia clase personalizada. Los pasos para hacer esto son los siguientes:

En Qt Designer, seleccione el QGraphicsView que desea reemplazar, luego haga clic derecho y seleccione Promover a …. En el cuadro de diálogo, establezca el Nombre de la clase promocionada en “custom_gv” y configure el archivo de encabezado en la ruta de importación de python para el módulo que contiene esta clase (por ejemplo, “mypkg.widgets”). Luego haga clic en Agregar y Promocionar , y verá el cambio de clase de “QGraphicsView” a “custom_gv” en el panel del Inspector de objetos.

Cuando el archivo de ui Qt Designer se convierte en código PyQt, agregará automáticamente una statement de importación como esta:

 from mypkg.widgets import custom_gv 

y luego en el código convertido reemplazará algo como esto:

  self.graphicsView = QtWidgets.QGraphicsView(MainWindow) 

con este:

  self.graphicsView = custom_gv(MainWindow) 

Por lo tanto, el código en el archivo ui no sabe nada sobre la clase personalizada: es solo un nombre que se importa desde otro lugar. Eso significa que eres completamente libre de escribir la clase personalizada de la forma que quieras.

En PyQt, este mecanismo funciona de la misma manera con pyuic que con el módulo uic . Las funciones loadUi y loadUiType generan exactamente el mismo código que pyuic . La única diferencia es que la herramienta pyuic escribe el código generado en un archivo, mientras que el módulo uic carga directamente a través de exec .