Widgets de PyQt 5: Ventanas y cuadros de diálogo

Hola a todos, después de mi artículo “Primeros pasos en PyQt 5 y Qt Designer”, empiezo una pequeña serie donde repasaré los widgets más esenciales de esta librería gráfica.
Widgets en la programación visual
Según la wikipedia, en el contexto de la programación de aplicaciones visuales, los widgets se pueden entender como componentes o controles que el programador reutiliza para construir interfaces gráficas de usuario (GUI). Algunos de los más comunes serían las ventanas, las etiquetas, los cuadros de texto, los botones, etc.
Ventanas y cuadros de diálogo
En PyQt, un widget que no está incrustado en un widget principal se llama ventana. Por lo general, las ventanas tienen un marco y una barra de título, aunque también es posible crear ventanas sin dicha decoración.
En Qt, QMainWindow (ventana principal) y las diversas subclases de QDialog (cuadros de diálogo) son los tipos de ventana más comunes, aunque también está la propia superclase QWidget (clase base de todos los widgets), cuyas instancias sin un padre asignado se convertirán también en ventanas.

La ventana principal QMainWindow
La ventana principal de la aplicación proporciona el marco para construir la interfaz de usuario principal y se crea heredando de QMainWindow. QMainWindow tiene su propio diseño al que puede agregar una barra de menú, barras de herramientas, widgets acoplables y una barra de estado. El área central puede estar ocupada por cualquier clase de QWidget.

from PyQt5.QtWidgets import QApplication, QMainWindow
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("Hola mundo")
self.setFixedSize(400, 200)
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()Cuadros de diálogo QDialog
Los cuadros de diálogo se usan como ventanas secundarias que presentan al usuario opciones y elecciones. Se crean heredando de QDialog y utilizan widgets y diseños para implementar la interfaz de usuario. Qt proporciona una serie de diálogos estándar listos para usar que se pueden usar para tareas estándar como selección de archivos o fuentes.

from PyQt5.QtWidgets import QApplication, QDialogclass Dialog(QDialog):
def __init__(self, *args, **kwargs):
super(Dialog, self).__init__(*args, **kwargs)
self.setWindowTitle("Hola mundo")
self.setFixedSize(400, 200)if __name__ == "__main__":
app = QApplication([])
dialog = Dialog()
dialog.show()
app.exec_()

from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButtonclass MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("Hola mundo")
self.setFixedSize(400, 200) self.button = QPushButton(self, text="Mostrar diálogo")
self.button.clicked.connect(self.show_dialog) def show_dialog(self):
dialog = Dialog(self) # self hace referencia al padre
dialog.show()class Dialog(QDialog):
def __init__(self, *args, **kwargs):
super(Dialog, self).__init__(*args, **kwargs)
self.setWindowTitle("Soy un popup")
self.setFixedSize(200, 100)if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButtonclass MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("Hola mundo")
self.setFixedSize(400, 200) self.button = QPushButton(self, text="Mostrar diálogo")
self.button.clicked.connect(self.show_dialog) def show_dialog(self):
QMessageBox.about(self, "Hola", "Soy un popup genérico")if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
Evidentemente tanto las ventanas principales como los diálogos se pueden crear con Qt Designer, además es una excelente forma de aprender Qt.
Con esto acabamos, próximamente repasaremos más widgets.

