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.

Pyside6: Crea el QTabWidget con una función en lugar de una clase.

He estado intentando hacer una aplicación utilizando Pyside6 y no logro entender por qué no puedo crear un QDialog con QTabWidget utilizando solo funciones.
No estoy seguro si estoy cometiendo algún error, así que aquí está el código que he escrito:

Importaciones:

from PySide6.QtWidgets import (QMessageBox, QApplication, QWidget, QGridLayout, QLabel, QMainWindow, QTabWidget,
                               QVBoxLayout)
from sys import argv

Función para dos pestañas:

def WelPage():
    grid = QGridLayout()
    wel_tab = QWidget()
    wel_tab.setLayout(grid)

    lab_name = QLabel("Este es un label")
    git_link = QLabel("Este es un enlace")
    git_link.setOpenExternalLinks(True)
    yt_link = QLabel("Otro enlace")
    yt_link.setOpenExternalLinks(True)

    grid.addWidget(lab_name, 0, 1)
    grid.addWidget(git_link, 1, 0)
    grid.addWidget(yt_link, 1, 3)

def AboutPage():
    about_tab = QWidget()
    lo = QVBoxLayout()
    purpose = QLabel("Una etiqueta muy larga")

    lo.addWidget(purpose)
    about_tab.setLayout(lo)

Función principal:

def main():
    w = QWidget()
    layout = QVBoxLayout()
    tw = QTabWidget()
    w.resize(450, 250)
    w.setWindowTitle('Título de la ventana')
    layout.addWidget(tw)

    tw.addTab(WelPage(), "Pantalla de bienvenida")
    tw.addTab(AboutPage(), "Acerca de")
    tw.show()

    w.setLayout(layout)
    w.show()
    app.exec()

if __name__ == "__main__":
    app = QApplication(argv)
    main()

El resultado es una ventana en blanco. No estoy seguro de por qué. ¿Por qué tengo que usar una clase en lugar de este método?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que no se puede crear un QDialog con un QTabWidget utilizando solo funciones es porque QDialog es un widget complejo que requiere mucha inicialización y configuración, y es necesario gestionar adecuadamente su ciclo de vida y su bucle de eventos.

    Cuando se crea una instancia de QDialog, se necesita mostrarla utilizando el método exec(), el cual crea un bucle de eventos anidado que espera a que el usuario interactúe con el diálogo y luego devuelve un resultado.

    Por otro lado, el QTabWidget es un widget más simple que se puede agregar a cualquier widget contenedor, como un QMainWindow, y no requiere ningún manejo especial del bucle de eventos.

    En su código de ejemplo, está creando el QTabWidget como un hijo de un QWidget, lo cual está bien, pero no está creando ninguna instancia de QDialog para contenerlo. Por lo tanto, solo está creando una ventana en blanco con un QTabWidget adentro, pero no se está mostrando como un diálogo.

    Para solucionar esto, es necesario crear una instancia de QDialog, establecer sus atributos (como su título y tamaño), agregar el QTabWidget a él y luego mostrarlo utilizando exec().

    Aquí hay un código de ejemplo que demuestra cómo crear un QDialog con un QTabWidget:

    from PySide6.QtWidgets import (
        QApplication, QDialog, QGridLayout, QLabel, QTabWidget, QVBoxLayout, QWidget
    )
    import sys
    
    
    def create_welcome_tab():
        grid = QGridLayout()
        tab = QWidget()
        tab.setLayout(grid)
    
        lab_name = QLabel("Esto es una etiqueta")
        git_link = QLabel("Esto es un enlace")
        git_link.setOpenExternalLinks(True)
        yt_link = QLabel("Otro enlace")
        yt_link.setOpenExternalLinks(True)
    
        grid.addWidget(lab_name, 0, 1)
        grid.addWidget(git_link, 1, 0)
        grid.addWidget(yt_link, 1, 3)
    
        return tab
    
    
    def create_about_tab():
        tab = QWidget()
        layout = QVBoxLayout()
        purpose = QLabel("Una etiqueta muy larga")
    
        layout.addWidget(purpose)
        tab.setLayout(layout)
    
        return tab
    
    
    def create_dialog():
        dialog = QDialog()
        dialog.setWindowTitle("Título de la ventana")
        dialog.resize(450, 250)
    
        tab_widget = QTabWidget(dialog)
        tab_widget.addTab(create_welcome_tab(), "Pantalla de bienvenida")
        tab_widget.addTab(create_about_tab(), "Acerca de")
    
        layout = QVBoxLayout()
        layout.addWidget(tab_widget)
    
        dialog.setLayout(layout)
    
        return dialog
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
    
        dialog = create_dialog()
        dialog.exec()
    
        sys.exit(app.exec())
    

    Este código define dos funciones que crean el contenido de las dos pestañas (create_welcome_tab() y create_about_tab()), una función que crea el diálogo y agrega el QTabWidget a él (create_dialog()), y luego inicia el ciclo de eventos de la aplicación llamando a app.exec().

    Cuando ejecute este código, se mostrará una instancia de QDialog con un QTabWidget que contiene dos pestañas (“Pantalla de bienvenida” y “Acerca de”).

Comments are closed.