Módulo 12: Widgets Especializados
Widgets avanzados para casos de uso específicos
Widgets avanzados para casos de uso específicos
---
Objetivos de Aprendizaje
Al finalizar este módulo serás capaz de:
- Usar Calendar Widget para selección de fechas
- Implementar Progress Bar y LCD Number para indicadores visuales
- Utilizar Graphics View para áreas de dibujo
- Integrar Custom Widgets de la biblioteca QT-PyQt-PySide-Custom-Widgets
- Seleccionar el widget adecuado para cada caso de uso avanzado
- Configurar propiedades avanzadas de cada widget especializado
---
12.1 Calendar Widget
Muestra un calendario interactivo completo. El usuario puede seleccionar fechas, navegar entre meses y años.
Propiedades clave
| Propiedad | Descripción | Ejemplo |
|---|---|---|
| ----------- | ------------- | --------- |
| **selectedDate** | La fecha seleccionada actualmente | `2024-12-25` |
| **minimumDate / maximumDate** | Rango de fechas permitidas | `2024-01-01` a `2024-12-31` |
| **gridVisible** | Mostrar u ocultar la cuadrícula | `true` |
| **horizontalHeaderFormat** | Formato del encabezado horizontal | `SingleLetterDayNames`, `ShortDayNames`, `LongDayNames`, `NoHorizontalHeader` |
| **verticalHeaderFormat** | Formato del encabezado vertical | `ISOWeekNumbers`, `NoVerticalHeader` |
| **firstDayOfWeek** | Primer día de la semana | `Monday`, `Sunday` |
| **selectionMode** | Modo de selección | `SingleSelection`, `NoSelection` |
| **navigationBarVisible** | Mostrar barra de navegación | `true` |
Signals útiles
| Signal | Cuándo se dispara |
|---|---|
| -------- | ------------------- |
| `selectionChanged()` | Al seleccionar una fecha diferente |
| `clicked(QDate)` | Al hacer clic en una fecha |
| `currentPageChanged(year, month)` | Al cambiar de mes/año |
| `activated(QDate)` | Al activar una fecha (doble clic o Enter) |
Cómo estilizar el Calendar Widget
QCalendarWidget {
background-color: #2d2d3d;
color: #ffffff;
border-radius: 8px;
}
QCalendarWidget QToolButton {
color: #41CD52;
background-color: #1a1a2e;
border: none;
border-radius: 4px;
padding: 6px;
font-weight: bold;
}
QCalendarWidget QToolButton:hover {
background-color: #41CD52;
color: #1a1a2e;
}
QCalendarWidget QMenu {
background-color: #2d2d3d;
color: #ffffff;
border: 1px solid #444;
}
QCalendarWidget QSpinBox {
background-color: #1a1a2e;
color: #ffffff;
border: 1px solid #444;
border-radius: 4px;
}
QCalendarWidget QWidget#qt_calendar_navigationbar {
background-color: #1a1a2e;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
}
QCalendarWidget QAbstractItemView:enabled {
color: #ffffff;
selection-background-color: #41CD52;
selection-color: #1a1a2e;
}
QCalendarWidget QAbstractItemView:disabled {
color: #555;
}
🎨 ANALOGÍA DEL DISEÑO
>
El Calendar Widget es como el componente de calendario que usarías en un diseño de app de reservas o agenda. Ya viene completamente funcional, no tienes que diseñarlo desde cero.
---
12.2 Progress Bar — Barra de Progreso
Muestra el avance de una operación de forma visual.
Propiedades clave
| Propiedad | Descripción | Ejemplo |
|---|---|---|
| ----------- | ------------- | --------- |
| **minimum** | Valor mínimo del rango | `0` |
| **maximum** | Valor máximo del rango | `100` |
| **value** | Valor actual | `75` |
| **textVisible** | Mostrar el porcentaje como texto | `true` |
| **orientation** | Horizontal o Vertical | `Horizontal` |
| **invertedAppearance** | Barra invertida | `false` |
| **format** | Formato del texto | `%p%` (porcentaje), `%v` (valor), `%m` (máximo) |
| **alignment** | Alineación del texto | `AlignCenter` |
Estilos para Progress Bar
/* Barra de progreso estándar */
QProgressBar {
background-color: #2d2d3d;
border: 1px solid #444;
border-radius: 10px;
text-align: center;
color: #ffffff;
height: 20px;
font-weight: bold;
}
QProgressBar::chunk {
background-color: #41CD52;
border-radius: 9px;
}
/* Barra de progreso con gradiente */
QProgressBar::chunk {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop:0 #41CD52, stop:1 #1D84BC);
border-radius: 9px;
}
/* Barra de progreso vertical */
QProgressBar:vertical {
width: 20px;
height: 200px;
}
Signals útiles
| Signal | Cuándo se dispara |
|---|---|
| -------- | ------------------- |
| `valueChanged(int)` | Al cambiar el valor |
---
12.3 LCD Number — Display Digital
Muestra números en un display estilo reloj digital.
Propiedades clave
| Propiedad | Descripción | Ejemplo |
|---|---|---|
| ----------- | ------------- | --------- |
| **digitCount** | Cantidad de dígitos a mostrar | `4` para "12:30" |
| **value** | El número a mostrar | `42` |
| **intValue** | El valor como entero | `42` |
| **mode** | Sistema numérico | `Dec` (decimal), `Hex` (hexadecimal), `Oct` (octal), `Bin` (binario) |
| **segmentStyle** | Estilo visual | `Flat`, `Filled`, `Outline` |
| **smallDecimalPoint** | Punto decimal pequeño | `true` / `false` |
Estilos para LCD Number
QLCDNumber {
background-color: #0d1117;
color: #41CD52;
border: 2px solid #444;
border-radius: 8px;
padding: 8px;
}
Cuándo usar LCD Number
- Contadores de tiempo (cronómetros, timers)
- Marcadores de puntuación
- Displays de temperatura, velocidad, etc.
- Cuando quieres un efecto visual retro/digital
---
12.4 Graphics View — Área de Dibujo
Un área de dibujo avanzada donde puedes mostrar gráficos 2D, diagramas, mapas y visualizaciones interactivas.
Características
- Soporta zoom, paneo (arrastre) y selección de elementos
- Puede mostrar formas geométricas, imágenes, texto y elementos personalizados
- Es la base para crear aplicaciones de dibujo, diagramas o visualización de datos
Propiedades clave
| Propiedad | Descripción |
|---|---|
| ----------- | ------------- |
| **alignment** | Alineación del contenido |
| **dragMode** | Modo de arrastre (NoDrag, ScrollHandDrag, RubberBandDrag) |
| **interactive** | Si los elementos son interactivos |
| **renderHints** | Calidad de renderizado (Antialiasing, TextAntialiasing, SmoothPixmapTransform) |
| **transformationAnchor** | Ancla para transformaciones (AnchorUnderMouse, AnchorViewCenter) |
| **resizeAnchor** | Ancla para redimensionado |
| **viewportUpdateMode** | Modo de actualización del viewport |
| **cacheMode** | Modo de caché del background |
Cuándo usar Graphics View
- Aplicaciones de dibujo o edición de imágenes
- Diagramas y flujogramas
- Mapas interactivos
- Visualización de datos (gráficos, diagramas)
- Juegos 2D simples
- Editores de circuitos o planos
🎨 ANALOGÍA DEL DISEÑO
>
El Graphics View es como el lienzo de Illustrator: un área infinita donde puedes colocar formas, imágenes y texto, hacer zoom, y moverte libremente.
---
12.5 Custom Widgets — QT-PyQt-PySide-Custom-Widgets
Además de los widgets estándar de Qt, existe la biblioteca QT-PyQt-PySide-Custom-Widgets que agrega widgets modernos y animados.
Instalación
pip install QT-PyQt-PySide-Custom-Widgets
Widgets Disponibles
Botones Animados
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **QCustomQPushButton** | Botones con animaciones y efectos modernos |
| **QCustomQPushButtonGroup** | Grupo de botones con comportamiento coordinado |
Navegación
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **QCustomSidebar** | Barra lateral colapsable con botones de navegación |
| **QCustomSidebarButton** | Botón de sidebar con icono y texto |
| **QCustomSidebarLabel** | Label para sidebar |
| **QCustomSlideMenu** | Menú deslizante animado |
| **QCustomHamburgerMenu** | Menú hamburguesa animado |
| **QCustomQStackedWidget** | Stacked Widget con transiciones animadas entre páginas |
Controles
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **QCustomQSlider** | Sliders estilizados con temas |
| **QCustomCheckBox** | Checkboxes animados con transiciones suaves |
| **QTagEdit** | Widget de entrada de etiquetas |
| **QCustomEmojiPicker** | Selector de emojis |
Progreso y Carga
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **QCustomRoundProgressBar** | Barra de progreso circular |
| **QCustomProgressIndicator** | Indicador de progreso circular |
| **QCustomArcLoader** | Animación de carga tipo spinner |
| **QCustom3CirclesLoader** | Animación de carga con 3 círculos |
| **QCustomSpinner** | Spinner clásico |
| **QFlowProgressBar** | Barra de progreso con onda fluida |
Display
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **QCardWidget** | Tarjeta con sombra y elevación (Material Design) |
| **QAvatarWidget** | Avatar de usuario con formas (circular, cuadrado) |
| **QBadgeWidget** | Badge de notificación |
| **AnalogGaugeWidget** | Medidor analógico tipo velocímetro |
| **QCustomQRGenerator** | Generador de códigos QR |
Temas
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **QCustomTheme** | Gestor de temas claro/oscuro |
| **QCustomThemeDarkLightToggle** | Botón toggle claro/oscuro |
| **QCustomThemeList** | Lista de temas seleccionables |
Efectos
| Widget | Descripción |
|---|---|
| -------- | ------------- |
| **AcrylicEffect** | Efecto de desenfoque tipo Windows Acrylic/Mica |
| **QCustomFlowLayout** | Layout de flujo dinámico |
| **QCustomHorizontalSeparator** | Separador estilizado |
| **QDraggableWidget** | Widget arrastrable |
Cómo usar Custom Widgets en Qt Designer
- Instala la biblioteca:
pip install QT-PyQt-PySide-Custom-Widgets - Inicia Qt Designer con los plugins:
Custom_Widgets --start-designer --plugins - Los widgets custom aparecerán en el Widget Box en una categoría separada
- Arrastra y suelta como cualquier otro widget
💡 CONSEJO: Estos widgets custom también aparecen en Qt Designer una vez instalada la biblioteca. Puedes arrastrarlos y soltarlos igual que los widgets estándar.
---
12.6 Tabla Comparativa de Widgets Especializados
| Widget | Para qué sirve | Complejidad | Cuándo usar |
|---|---|---|---|
| -------- | ---------------- | ------------- | ------------- |
| **Calendar Widget** | Selección de fechas | Baja | Formularios con fechas |
| **Progress Bar** | Mostrar progreso | Baja | Operaciones largas |
| **LCD Number** | Display digital | Baja | Contadores, timers |
| **Graphics View** | Área de dibujo 2D | Alta | Editores, diagramas |
| **QCustomQPushButton** | Botón animado | Media | Interfaces modernas |
| **QCustomSidebar** | Navegación lateral | Media | Apps con múltiples secciones |
| **QCustomRoundProgressBar** | Progreso circular | Media | Dashboards, métricas |
| **QCardWidget** | Tarjeta con sombra | Baja | Interfaces Material Design |
| **AnalogGaugeWidget** | Medidor analógico | Media | Paneles de control |
---
Ejercicio Práctico del Módulo
🏋️ EJERCICIO 12: Dashboard de Métricas
>
Objetivo: Crear un dashboard con widgets especializados para mostrar métricas.
>
Pasos:
1. Crea un Dialog de 600x500 píxeles con fondo oscuro (
#1a1a2e)2. Cambia el
windowTitlea "Dashboard de Métricas"3. Aplica un Layout Vertical al Dialog
4. Agrega un Label de título: "Dashboard" (fuente 20pt, Bold, blanco)
5. Agrega un Calendar Widget en la parte superior
6. Debajo del calendario, agrega un Grid Layout con 2 columnas:
- Columna izquierda:
- Label "Progreso del proyecto:" + Progress Bar (value: 75, textVisible: true)
- Label "Tareas completadas:" + LCD Number (digitCount: 3, value: 42)
- Columna derecha:
- Label "Velocidad:" + Dial (min: 0, max: 100, value: 65)
- Label "Nivel:" + LCD Number (digitCount: 2, value: 65)
7. Conecta el Dial al LCD Number de "Nivel" usando Signals/Slots
8. Debajo del Grid, agrega un Label: "Estado del sistema:"
9. Agrega un Horizontal Layout con:
- Label "CPU:" + Progress Bar (value: 45)
- Label "RAM:" + Progress Bar (value: 72)
- Label "Disco:" + Progress Bar (value: 33)
10. Estiliza todos los Progress Bars con el tema verde
11. Estiliza los LCD Numbers con fondo oscuro y texto verde
12. Renombra todos los widgets
13. Guarda como
dashboard.ui14. Presiona
Ctrl+Ry verifica que el dial controle el LCD Number
>
Resultado esperado: Un dashboard con calendario, barras de progreso, displays digitales y un dial interactivo, todo con tema oscuro coherente.
---
Recursos Adicionales
| Recurso | Descripción |
|---|---|
| --------- | ------------- |
| [QCalendarWidget Documentation](https://doc.qt.io/qt-6/qcalendarwidget.html) | Documentación del Calendar Widget |
| [QProgressBar Documentation](https://doc.qt.io/qt-6/qprogressbar.html) | Documentación del Progress Bar |
| [QLCDNumber Documentation](https://doc.qt.io/qt-6/qlcdnumber.html) | Documentación del LCD Number |
| [QGraphicsView Documentation](https://doc.qt.io/qt-6/qgraphicsview.html) | Documentación del Graphics View |
| [Custom Widgets Documentation](https://qtcustomwidgets.spinncode.com/) | Documentación de Custom Widgets |
| [25 Modern GUI Tutorial](https://github.com/SpinnCompany/25-Modern-GUI-Tutorial) | Tutorial de GUIs modernas con Custom Widgets |
---
Evaluación de Comprensión
- ¿Qué widget usarías para que el usuario seleccione una fecha?
- ¿Cómo muestras un número en un display estilo reloj digital?
- ¿Qué propiedad del Progress Bar controla si muestra el porcentaje?
- ¿Para qué sirve el Graphics View?
- ¿Cómo instalas los Custom Widgets?
- ¿Qué widget custom usarías para una barra lateral de navegación?
- ¿Qué widget custom usarías para una tarjeta con efecto de elevación?
- ¿Cómo conectas un Dial a un LCD Number para que muestre su valor?
- ¿Qué formato de texto muestra el Progress Bar con
%p%? - ¿Qué widget usarías para un medidor tipo velocímetro?
---
Módulo anterior: ← [Módulo 11: Formularios](10-formularios.md)
Siguiente módulo: → [Módulo 13: Exportación](12-exportacion.md)
Escribe tus respuestas y luego presiona el botón para comparar con las respuestas correctas.