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.

Comunicación entre QMainWindow y QWidget de PySide6

Tengo 2 archivos (main, widget1), lo que necesito es poder comunicarme entre los dos.

edit: Disculpa por el desorden, intentaré poner un código más limpio.

Así que tengo un archivo principal con un stackedWidget (con un archivo de interfaz de usuario generado por Qt Designer) y un archivo de widget (también con un archivo de interfaz de usuario generado por Qt).
Lo que necesito es poder acceder al archivo principal desde el widget para poder cambiar la página del stackedWidget.

main.py:

from ui_main import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.widget1 = W1.Widget1(self)
        self.ui.stackedWidget_1.insertWidget(0, self.widget1)
        self.ui.stackedWidget_1.setCurrentIndex(0)

        def nextpage():
            self.ui.stackedWidget_1.setCurrentIndex(0)

        self.ui.b0.clicked.connect(nextpage)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

widget.py

from PySide6.QtWidgets import *
from ui_widget import Ui_W1
import main

class Widget1(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.ui = Ui_W1()
        self.ui.setupUi(self)

        def widget_next_page():
            main.MainWindow().ui.stackedWidget_1.setCurrentIndex(0)
            print('0')

        self.ui.widget_button.clicked.connect(widget_next_page)

Gracias por cualquier ayuda, estoy tratando de entender cómo separar el código en archivos para que el archivo principal no sea enorme…
Si hay alguna mejor manera (no demasiado complicada, porque como seguramente ya sabes, estoy empezando).

Tags:  

Answer

  1. Avatar for davy.ai

    Para comunicarse entre el archivo principal y el archivo “widget1”, puedes pasar la referencia de la ventana principal a “widget1” cuando se crea, y luego acceder a los métodos y variables de la ventana principal desde dentro de “widget1” utilizando esa referencia.

    Código actualizado:

    main.py:

    from ui_main import Ui_MainWindow
    from widget1 import Widget1
    
    class MainWindow(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.widget1 = Widget1(self) # pasar la referencia de la ventana principal a "widget1"
            self.ui.stackedWidget_1.insertWidget(0, self.widget1)
            self.ui.stackedWidget_1.setCurrentIndex(0)
    
            def siguiente_pagina():
                self.ui.stackedWidget_1.setCurrentIndex(0)
    
            self.ui.b0.clicked.connect(siguiente_pagina)
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ventana = MainWindow()
        ventana.show()
        sys.exit(app.exec())
    

    widget1.py:

    from PySide6.QtWidgets import *
    from ui_widget import Ui_W1
    
    class Widget1(QWidget):
        def __init__(self, ventana_principal, *args, **kwargs):
            QWidget.__init__(self, *args, **kwargs)
            self.ui = Ui_W1()
            self.ui.setupUi(self)
            self.ventana_principal = ventana_principal # almacenar la referencia de la ventana principal
    
            def siguiente_pagina_widget():
                self.ventana_principal.ui.stackedWidget_1.setCurrentIndex(0)
                print('0')
    
            self.ui.widget_button.clicked.connect(siguiente_pagina_widget)
    

    En este código actualizado, pasamos la referencia de la ventana principal a “widget1” cuando lo creamos en el archivo principal. En “widget1”, almacenamos esa referencia en la variable self.ventana_principal y la utilizamos para acceder a “stackedWidget_1” en el archivo principal.

    De esta manera, podemos acceder a los métodos y variables del archivo principal desde dentro de “widget1” sin tener que crear un nuevo objeto de ventana principal en “widget1”.

    ¡Espero que esto sea de ayuda!

Comments are closed.