Módulo 7

Módulo 7: Propiedades Avanzadas y Estilos

Personaliza cada píxel de tu interfaz con el Property Editor y Qt Style Sheets

Personaliza cada píxel de tu interfaz con el Property Editor y Qt Style Sheets

---

Objetivos de Aprendizaje

Al finalizar este módulo serás capaz de:

  • Dominar el Property Editor y todas sus secciones
  • Aplicar Qt Style Sheets (QSS) para personalizar la apariencia
  • Usar pseudo-estados para efectos hover, pressed, focus, etc.
  • Estilizar widgets individuales y toda la aplicación
  • Controlar tamaños y restricciones de widgets
  • Crear temas visuales coherentes y profesionales
  • Usar propiedades avanzadas como toolTip, whatsThis, y cursor

---

7.1 El Property Editor — Tu Centro de Control

El Property Editor muestra todas las propiedades del widget seleccionado, organizadas en secciones colapsables.

Secciones principales

QObject

Propiedad Descripción Ejemplo
----------- ------------- ---------
**objectName** Nombre interno único del widget `nombre_input`, `guardar_btn`

💡 CONSEJO: El objectName es como el nombre de capa en Photoshop. Usa nombres descriptivos desde el inicio.

QWidget — Propiedades Visuales Básicas

Propiedad Descripción Ejemplo
----------- ------------- ---------
**enabled** Si el widget está activo o desactivado (gris) `true` / `false`
**geometry** Posición y tamaño (x, y, ancho, alto) `0, 0, 400, 300`
**sizePolicy** Cómo se comporta al redimensionar `Preferred`, `Expanding`, `Fixed`
**minimumSize** Tamaño mínimo absoluto `100, 30`
**maximumSize** Tamaño máximo absoluto `16777215, 16777215`
**sizeIncrement** Incremento de tamaño al redimensionar `0, 0`
**baseSize** Tamaño base para cálculos de layout `0, 0`
**font** Tipografía, tamaño, peso, estilo `Segoe UI, 12pt, Bold`
**cursor** Forma del cursor al pasar el mouse `PointingHandCursor`
**mouseTracking** Rastrear mouse sin botones presionados `false`
**toolTip** Texto emergente al pasar el mouse "Haz clic para guardar"
**toolTipDuration** Duración del tooltip en milisegundos `3000`
**statusTip** Texto en la barra de estado "Guarda los cambios"
**whatsThis** Ayuda contextual más detallada "Este campo acepta solo emails válidos"
**accessibleName** Nombre para lectores de pantalla "Campo de nombre"
**accessibleDescription** Descripción para accesibilidad "Escribe tu nombre completo"
**styleSheet** CSS personalizado para el widget `background-color: #1a1a2e;`
**locale** Configuración regional `Spanish`
**windowTitle** Título de la ventana "Mi Aplicación"
**windowIcon** Icono de la ventana `:/iconos/logo.png`
**windowOpacity** Opacidad de la ventana (0.0 a 1.0) `1.0`
**autoFillBackground** Rellenar fondo automáticamente `false`

Propiedades Específicas del Widget

Cada tipo de widget tiene propiedades adicionales que se muestran debajo de QWidget. Por ejemplo:

Para Label:

Propiedad Descripción
----------- -------------
**text** El texto que muestra
**textFormat** PlainText, RichText, AutoText, MarkdownText
**pixmap** Imagen que muestra
**scaledContents** Si la imagen se escala al tamaño del Label
**alignment** Alineación del texto
**wordWrap** Si el texto se ajusta en varias líneas
**margin** Margen interno
**indent** Sangría del texto
**openExternalLinks** Si los links se abren en el navegador

Para Push Button:

Propiedad Descripción
----------- -------------
**text** Texto del botón
**icon** Icono del botón
**iconSize** Tamaño del icono
**shortcut** Atajo de teclado
**default** Botón por defecto (Enter)
**autoDefault** Se vuelve default al tener foco
**flat** Sin borde elevado

Para Line Edit:

Propiedad Descripción
----------- -------------
**text** Contenido actual
**placeholderText** Texto de sugerencia cuando está vacío
**maxLength** Máximo de caracteres
**readOnly** Solo lectura
**echoMode** Normal, Password, NoEcho, PasswordEchoOnEdit
**alignment** Alineación del texto
**clearButtonEnabled** Botón X para limpiar
**dragEnabled** Permitir arrastrar texto
**inputMask** Máscara de entrada
**inputMethodHints** Sugerencias para métodos de entrada

---

7.2 Propiedades de Accesibilidad

Propiedad Descripción Por qué importa
----------- ------------- -----------------
**toolTip** Texto emergente al pasar el mouse Ayuda a todos los usuarios
**whatsThis** Ayuda contextual detallada Explicación completa de la función
**accessibleName** Nombre para lectores de pantalla Esencial para usuarios con discapacidad visual
**accessibleDescription** Descripción para accesibilidad Contexto adicional para lectores de pantalla

💡 CONSEJO: Siempre agrega toolTip a los botones que solo tienen icono. Un botón con un icono de disquete sin tooltip no le dice nada a un usuario nuevo. Con un tooltip que diga "Guardar (Ctrl+S)", es mucho más claro.

---

7.3 Cursores del Mouse

La propiedad cursor cambia la forma del cursor cuando pasa sobre el widget.

Cursor Cuándo usarlo
-------- ---------------
**ArrowCursor** Cursor normal (por defecto)
**PointingHandCursor** Elementos clicables (links, botones)
**OpenHandCursor** Elementos arrastrables
**ClosedHandCursor** Mientras se arrastra
**IBeamCursor** Campos de texto
**WaitCursor** Operación en progreso
**SizeHorCursor** Redimensionar horizontal
**SizeVerCursor** Redimensionar vertical
**SizeFDiagCursor** Redimensionar diagonal
**CrossCursor** Selección precisa
**ForbiddenCursor** Acción no permitida
**WhatsThisCursor** Modo de ayuda contextual

---

7.4 Qt Style Sheets (QSS) — CSS para Qt

Qt Style Sheets es un sistema de estilos muy similar a CSS de la web. Puedes cambiar colores, bordes, bordes redondeados, gradientes, y mucho más.

🎨 ANALOGÍA DEL DISEÑO

>

Si Qt Designer es como diseñar en Figma, los Style Sheets son como el panel de estilos de Figma donde defines colores, sombras, bordes y efectos. La sintaxis es casi idéntica a CSS.

Cómo aplicar estilos

  1. Selecciona un widget
  2. En el Property Editor, busca la propiedad styleSheet
  3. Haz clic en el botón ... para abrir el editor de style sheets
  4. Escribe tus reglas CSS

Sintaxis básica

/* Selector de tipo */
QPushButton {
    background-color: #41CD52;
    color: #1a1a2e;
    border: none;
    padding: 10px 24px;
    border-radius: 8px;
    font-size: 14px;
    font-weight: bold;
}

/* Selector por nombre de objeto */
#guardar_btn {
    background-color: #41CD52;
}

#cancelar_btn {
    background-color: #FF6B6B;
}

/* Pseudo-estados */
QPushButton:hover {
    background-color: #2D9B3E;
}

QPushButton:pressed {
    background-color: #1a7a2e;
}

QPushButton:disabled {
    background-color: #555;
    color: #888;
}

Estilizar un campo de texto

QLineEdit {
    background-color: #2d2d3d;
    color: #ffffff;
    border: 2px solid #444;
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 13px;
}

QLineEdit:focus {
    border-color: #41CD52;
}

QLineEdit:disabled {
    background-color: #1a1a2e;
    color: #555;
}

Estilizar toda la ventana

/* Fondo de toda la ventana */
QDialog {
    background-color: #1a1a2e;
}

/* Todos los labels */
QLabel {
    color: #e0e0e0;
    font-size: 14px;
}

/* Todos los Group Boxes */
QGroupBox {
    border: 1px solid #444;
    border-radius: 8px;
    margin-top: 10px;
    padding-top: 15px;
    font-weight: bold;
    color: #41CD52;
}

QGroupBox::title {
    subcontrol-origin: margin;
    left: 10px;
    padding: 0 5px;
}

Estilizar un Combo Box

QComboBox {
    background-color: #2d2d3d;
    color: #ffffff;
    border: 2px solid #444;
    border-radius: 6px;
    padding: 6px 12px;
    min-width: 6em;
}

QComboBox:hover {
    border-color: #41CD52;
}

QComboBox::drop-down {
    border: none;
    width: 20px;
}

QComboBox::down-arrow {
    image: url(:/iconos/arrow-down.png);
    width: 12px;
    height: 12px;
}

QComboBox QAbstractItemView {
    background-color: #2d2d3d;
    color: #ffffff;
    selection-background-color: #41CD52;
    selection-color: #1a1a2e;
}

Estilizar un Slider

QSlider::groove:horizontal {
    background: #444;
    height: 6px;
    border-radius: 3px;
}

QSlider::handle:horizontal {
    background: #41CD52;
    width: 18px;
    margin: -6px 0;
    border-radius: 9px;
}

QSlider::handle:horizontal:hover {
    background: #2D9B3E;
}

QSlider::sub-page:horizontal {
    background: #41CD52;
    border-radius: 3px;
}

Estilizar un Check Box

QCheckBox {
    color: #e0e0e0;
    spacing: 8px;
}

QCheckBox::indicator {
    width: 18px;
    height: 18px;
    border: 2px solid #444;
    border-radius: 4px;
    background-color: #2d2d3d;
}

QCheckBox::indicator:checked {
    background-color: #41CD52;
    border-color: #41CD52;
}

QCheckBox::indicator:hover {
    border-color: #41CD52;
}

---

7.5 Pseudo-estados Disponibles

Pseudo-estado Cuándo se aplica Ejemplo de uso
--------------- ------------------ ----------------
`:hover` Mouse sobre el widget Cambiar color al pasar el mouse
`:pressed` Botón siendo presionado Efecto de hundido
`:checked` Widget marcado (checkbox, radio) Cambiar color cuando está activo
`:unchecked` Widget desmarcado Estilo cuando no está activo
`:disabled` Widget desactivado Color gris
`:enabled` Widget activado Color normal
`:focus` Widget tiene el foco del teclado Borde de color
`:selected` Widget seleccionado Fondo de selección
`:read-only` Widget en solo lectura Estilo diferente
`:indeterminate` Estado intermedio (checkbox tristate) Color amarillo

---

7.6 Sub-controles (Sub-controls)

Para widgets complejos, puedes estilizar partes individuales:

/* Scrollbar */
QScrollBar:vertical {
    background: #1a1a2e;
    width: 12px;
    border-radius: 6px;
}

QScrollBar::handle:vertical {
    background: #444;
    border-radius: 6px;
    min-height: 30px;
}

QScrollBar::handle:vertical:hover {
    background: #41CD52;
}

QScrollBar::add-line:vertical,
QScrollBar::sub-line:vertical {
    height: 0px;
}

/* Tab Widget */
QTabWidget::pane {
    border: 1px solid #444;
    border-radius: 6px;
    background: #2d2d3d;
}

QTabBar::tab {
    background: #1a1a2e;
    color: #888;
    padding: 8px 16px;
    border-top-left-radius: 6px;
    border-top-right-radius: 6px;
}

QTabBar::tab:selected {
    background: #2d2d3d;
    color: #41CD52;
}

QTabBar::tab:hover:!selected {
    background: #222240;
    color: #ccc;
}

/* Progress Bar */
QProgressBar {
    background-color: #2d2d3d;
    border: 1px solid #444;
    border-radius: 6px;
    text-align: center;
    color: #ffffff;
}

QProgressBar::chunk {
    background-color: #41CD52;
    border-radius: 5px;
}

---

7.7 Gradientes

/* Gradiente lineal */
QPushButton {
    background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
        stop:0 #41CD52, stop:1 #2D9B3E);
    color: white;
    border: none;
    padding: 10px 24px;
    border-radius: 8px;
}

/* Gradiente radial */
QFrame {
    background: qradialgradient(cx:0.5, cy:0.5, radius:0.5,
        fx:0.5, fy:0.5,
        stop:0 #41CD52, stop:1 #1a1a2e);
}

/* Gradiente cónico */
QFrame {
    background: qconicalgradient(cx:0.5, cy:0.5, angle:0,
        stop:0 #41CD52, stop:0.5 #1D84BC, stop:1 #41CD52);
}

---

7.8 Tamanos y Restricciones

Propiedades de tamaño

Propiedad Descripción Cuándo usar
----------- ------------- -------------
**minimumSize** El tamaño mínimo absoluto "Este botón nunca debe ser más pequeño que 100x30"
**maximumSize** El tamaño máximo absoluto "Este logo nunca debe pasar de 200px"
**sizeHint** El tamaño "recomendado" (calculado por Qt) Automático, no lo configures manualmente
**baseSize** Tamaño base para cálculos de layout Para widgets que crecen proporcionalmente
**sizeIncrement** Incremento de tamaño al redimensionar Para widgets que deben crecer en pasos fijos

🎨 ANALOGÍA DEL DISEÑO

>

Es como definir los constraints en Figma:

>

- "este botón debe tener al menos 120px de ancho" → minimumSize

- "este logo nunca debe pasar de 200px" → maximumSize

- "este texto debe tener el tamaño natural de la fuente" → sizeHint (automático)

Size Policy en detalle

Política Horizontal Vertical Ejemplo de uso
---------- ----------- ---------- ----------------
**Fixed** No cambia No cambia Botones, iconos, logos
**Minimum** Puede crecer Puede crecer Widgets con tamaño mínimo importante
**Maximum** Puede encoger Puede encoger Widgets que no deben ser muy grandes
**Preferred** Tamaño ideal Tamaño ideal Labels, textos (por defecto)
**Expanding** Quiere más espacio Quiere más espacio Text Edit, List Widget, Table Widget
**MinimumExpanding** Crece con mínimo Crece con mínimo Similar a Expanding
**Ignored** Ignora sizeHint Ignora sizeHint Casos especiales

---

7.9 Herencia de Estilos

Los estilos se heredan de padre a hijo. Si aplicas un styleSheet al Dialog, todos los widgets dentro heredarán esos estilos.

/* Aplicado al Dialog — afecta a TODOS los widgets hijos */
QDialog {
    background-color: #1a1a2e;
    font-family: "Segoe UI";
    font-size: 13px;
}

/* Pero puedes sobrescribir para widgets específicos */
QLineEdit {
    background-color: #2d2d3d;
    color: #ffffff;
}

QPushButton {
    background-color: #41CD52;
    color: #1a1a2e;
}

💡 CONSEJO: Aplica los estilos globales al widget padre (Dialog o MainWindow) y luego sobrescribe solo los widgets que necesitan estilos diferentes. Esto mantiene tu código limpio y consistente.

---

7.10 Temas Visuales — Ejemplo Completo

Tema Oscuro Profesional

/* === TEMA OSCURO PROFESIONAL === */

/* Fondo principal */
QDialog, QMainWindow, QWidget {
    background-color: #1a1a2e;
    color: #e0e0e0;
    font-family: "Segoe UI", "Arial", sans-serif;
    font-size: 13px;
}

/* Labels */
QLabel {
    color: #e0e0e0;
}

QLabel#titulo_label {
    font-size: 20px;
    font-weight: bold;
    color: #ffffff;
}

/* Campos de entrada */
QLineEdit, QTextEdit, QPlainTextEdit {
    background-color: #2d2d3d;
    color: #ffffff;
    border: 2px solid #444;
    border-radius: 6px;
    padding: 8px 12px;
    selection-background-color: #41CD52;
    selection-color: #1a1a2e;
}

QLineEdit:focus, QTextEdit:focus {
    border-color: #41CD52;
}

/* Botones */
QPushButton {
    background-color: #41CD52;
    color: #1a1a2e;
    border: none;
    padding: 10px 24px;
    border-radius: 8px;
    font-weight: bold;
    font-size: 13px;
}

QPushButton:hover {
    background-color: #2D9B3E;
}

QPushButton:pressed {
    background-color: #1a7a2e;
}

QPushButton#cancelar_btn {
    background-color: #555;
    color: #ccc;
}

QPushButton#cancelar_btn:hover {
    background-color: #666;
}

/* Group Box */
QGroupBox {
    border: 1px solid #444;
    border-radius: 8px;
    margin-top: 12px;
    padding-top: 15px;
    font-weight: bold;
    color: #41CD52;
}

QGroupBox::title {
    subcontrol-origin: margin;
    left: 12px;
    padding: 0 8px;
}

/* Combo Box */
QComboBox {
    background-color: #2d2d3d;
    color: #ffffff;
    border: 2px solid #444;
    border-radius: 6px;
    padding: 6px 12px;
}

QComboBox:hover {
    border-color: #41CD52;
}

QComboBox::drop-down {
    border: none;
    width: 24px;
}

/* Slider */
QSlider::groove:horizontal {
    background: #444;
    height: 6px;
    border-radius: 3px;
}

QSlider::handle:horizontal {
    background: #41CD52;
    width: 18px;
    margin: -6px 0;
    border-radius: 9px;
}

QSlider::sub-page:horizontal {
    background: #41CD52;
    border-radius: 3px;
}

/* Check Box */
QCheckBox {
    color: #e0e0e0;
    spacing: 8px;
}

QCheckBox::indicator {
    width: 18px;
    height: 18px;
    border: 2px solid #444;
    border-radius: 4px;
    background-color: #2d2d3d;
}

QCheckBox::indicator:checked {
    background-color: #41CD52;
    border-color: #41CD52;
}

/* Scrollbar */
QScrollBar:vertical {
    background: #1a1a2e;
    width: 10px;
    border-radius: 5px;
}

QScrollBar::handle:vertical {
    background: #444;
    border-radius: 5px;
    min-height: 30px;
}

QScrollBar::handle:vertical:hover {
    background: #41CD52;
}

/* Tab Widget */
QTabWidget::pane {
    border: 1px solid #444;
    border-radius: 6px;
    background: #2d2d3d;
}

QTabBar::tab {
    background: #1a1a2e;
    color: #888;
    padding: 8px 16px;
    border-top-left-radius: 6px;
    border-top-right-radius: 6px;
    margin-right: 2px;
}

QTabBar::tab:selected {
    background: #2d2d3d;
    color: #41CD52;
}

QTabBar::tab:hover:!selected {
    background: #222240;
    color: #ccc;
}

/* Progress Bar */
QProgressBar {
    background-color: #2d2d3d;
    border: 1px solid #444;
    border-radius: 6px;
    text-align: center;
    color: #ffffff;
    height: 20px;
}

QProgressBar::chunk {
    background-color: #41CD52;
    border-radius: 5px;
}

/* List / Table / Tree */
QListWidget, QTableWidget, QTreeWidget {
    background-color: #2d2d3d;
    color: #ffffff;
    border: 1px solid #444;
    border-radius: 6px;
    gridline-color: #333;
}

QListWidget::item:selected,
QTableWidget::item:selected,
QTreeWidget::item:selected {
    background-color: #41CD52;
    color: #1a1a2e;
}

QHeaderView::section {
    background-color: #1a1a2e;
    color: #41CD52;
    padding: 6px;
    border: none;
    font-weight: bold;
}

/* Tool Box */
QToolBox::tab {
    background: #2d2d3d;
    border: 1px solid #444;
    border-radius: 6px;
    padding: 8px;
    color: #e0e0e0;
    font-weight: bold;
}

QToolBox::tab:selected {
    background: #41CD52;
    color: #1a1a2e;
}

/* Spin Box */
QSpinBox, QDoubleSpinBox {
    background-color: #2d2d3d;
    color: #ffffff;
    border: 2px solid #444;
    border-radius: 6px;
    padding: 6px 12px;
}

QSpinBox:focus, QDoubleSpinBox:focus {
    border-color: #41CD52;
}

/* Calendar */
QCalendarWidget {
    background-color: #2d2d3d;
    color: #ffffff;
}

QCalendarWidget QToolButton {
    color: #41CD52;
    background-color: #1a1a2e;
    border: none;
    border-radius: 4px;
    padding: 4px;
}

QCalendarWidget QMenu {
    background-color: #2d2d3d;
    color: #ffffff;
}

QCalendarWidget QSpinBox {
    background-color: #1a1a2e;
    color: #ffffff;
}

QCalendarWidget QWidget#qt_calendar_navigationbar {
    background-color: #1a1a2e;
}

/* LCD Number */
QLCDNumber {
    background-color: #0d1117;
    color: #41CD52;
    border: 2px solid #444;
    border-radius: 6px;
}

---

Ejercicio Práctico del Módulo

🏋️ EJERCICIO 7: Tarjeta de Producto con Estilos Profesionales

>

Objetivo: Crear una tarjeta de producto con estilos profesionales usando Qt Style Sheets.

>

Pasos:

1. Crea un Dialog de 400x350 píxeles

2. Cambia el windowTitle a "Producto"

3. Aplica un estilo de fondo oscuro al Dialog: background-color: #1a1a2e;

4. Agrega un Frame como contenedor de la tarjeta:

- styleSheet: background-color: #2d2d3d; border-radius: 12px;

- minimumSize: 360x300

- Aplica un Layout Vertical al Frame

5. Dentro del Frame, agrega un Label para el nombre del producto:

- text: "Auriculares Premium"

- font: 18pt, Bold, blanco

- alignment: AlignCenter

6. Agrega un Label para una descripción breve:

- text: "Sonido envolvente 7.1 con cancelación de ruido activa"

- font: 11pt, color gris (#aaa)

- alignment: AlignCenter

- wordWrap: true

7. Agrega un Label para el precio:

- text: "$149.99"

- font: 24pt, Bold, color verde (#41CD52)

- alignment: AlignCenter

8. Agrega un Label para la descripción detallada:

- text: "Auriculares inalámbricos con Bluetooth 5.2, batería de 40 horas, micrófono integrado y estuche de carga."

- font: 11pt, color gris claro

- wordWrap: true

- alignment: AlignCenter

9. Agrega un Push Button con texto "🛒 Agregar al Carrito":

- font: 13pt, Bold

- styleSheet:

`css

QPushButton {

background-color: #41CD52;

color: #1a1a2e;

border: none;

padding: 12px 24px;

border-radius: 8px;

font-weight: bold;

}

QPushButton:hover {

background-color: #2D9B3E;

}

QPushButton:pressed {

background-color: #1a7a2e;

}

`

10. Agrega un Horizontal Line como separador antes del botón

11. Renombra todos los widgets

12. Guarda como tarjeta_producto.ui

13. Presiona Ctrl+R y verifica que se vea profesional

>

Resultado esperado: Una tarjeta de producto elegante con fondo oscuro, tipografía jerárquica, precio destacado en verde y un botón llamativo con efecto hover.

---

Recursos Adicionales

Recurso Descripción
--------- -------------
[Qt Style Sheets Reference](https://doc.qt.io/qt-6/stylesheet-reference.html) Referencia completa de QSS
[Qt Style Sheets Examples](https://doc.qt.io/qt-6/stylesheet-examples.html) Ejemplos de estilos para cada widget
[CSS-Tricks](https://css-tricks.com) Referencia de CSS (muy similar a QSS)
[Coolors.co](https://coolors.co) Generador de paletas de colores

---

Evaluación de Comprensión

  1. ¿Qué propiedad del Property Editor usarías para agregar un texto de ayuda al pasar el mouse?
  2. ¿Cuál es la diferencia entre toolTip y whatsThis?
  3. ¿Cómo aplicas un estilo a TODOS los botones de una ventana?
  4. ¿Cómo aplicas un estilo a UN botón específico?
  5. ¿Qué pseudo-estado usarías para cambiar el color de un botón cuando el mouse pasa sobre él?
  6. ¿Qué es un sub-control en Qt Style Sheets? Da un ejemplo.
  7. ¿Cómo creas un gradiente lineal en QSS?
  8. ¿Qué sizePolicy usarías para un widget que debe ocupar todo el espacio disponible?
  9. ¿Cómo haces que los estilos se apliquen a todos los widgets hijos?
  10. ¿Qué cursor usarías para un elemento que el usuario puede arrastrar?

---

Módulo anterior: ← [Módulo 6: Signals y Slots](05-signals-slots.md)

Siguiente módulo: → [Módulo 8: Iconos y Recursos](07-iconos-recursos.md)

📝 Evaluación de Comprensión

Escribe tus respuestas y luego presiona el botón para comparar con las respuestas correctas.

1. ¿Qué propiedad del Property Editor usarías para agregar un texto de ayuda al pasar el mouse?
✅ Respuesta Correcta
toolTip
2. ¿Cuál es la diferencia entre toolTip y whatsThis?
✅ Respuesta Correcta
toolTip es un texto emergente breve que aparece al pasar el mouse sobre el widget. whatsThis es una ayuda contextual más detallada que explica la función del widget con mayor profundidad.
3. ¿Cómo aplicas un estilo a TODOS los botones de una ventana?
✅ Respuesta Correcta
Usando un selector de tipo en el styleSheet del widget padre: QPushButton { background-color: #41CD52; ... }
4. ¿Cómo aplicas un estilo a UN botón específico?
✅ Respuesta Correcta
Usando un selector por nombre de objeto: #nombre_del_boton { background-color: #FF6B6B; ... }
5. ¿Qué pseudo-estado usarías para cambiar el color de un botón cuando el mouse pasa sobre él?
✅ Respuesta Correcta
:hover
6. ¿Qué es un sub-control en Qt Style Sheets? Da un ejemplo.
✅ Respuesta Correcta
Un sub-control permite estilizar partes individuales de un widget complejo. Ejemplo: QScrollBar::handle:vertical estiliza solo el manejador (la parte arrastrable) de la barra de scroll vertical.
7. ¿Cómo creas un gradiente lineal en QSS?
✅ Respuesta Correcta
Usando qlineargradient: background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #41CD52, stop:1 #2D9B3E);
8. ¿Qué sizePolicy usarías para un widget que debe ocupar todo el espacio disponible?
✅ Respuesta Correcta
Expanding
9. ¿Cómo haces que los estilos se apliquen a todos los widgets hijos?
✅ Respuesta Correcta
Aplicando el styleSheet al widget padre (Dialog o MainWindow). Los estilos se heredan de padre a hijo.
10. ¿Qué cursor usarías para un elemento que el usuario puede arrastrar?
✅ Respuesta Correcta
OpenHandCursor (para indicar que es arrastrable) o ClosedHandCursor (mientras se está arrastrando).
🏋️ Ejercicio Práctico

Ejercicio 7: Tarjeta de Producto Estilizada

Módulo 7: Propiedades Avanzadas

---

Objetivo

Crear una tarjeta de producto con estilos profesionales usando Qt Style Sheets.

---

Instrucciones

  1. Crea un Dialog de 400x350 píxeles
  2. windowTitle: "Producto"
  3. Fondo del Dialog: background-color: #1a1a2e;
  4. Frame como contenedor de la tarjeta:
  • styleSheet: background-color: #2d2d3d; border-radius: 12px;
  • minimumSize: 360x300
  • Layout Vertical
  1. Label nombre: "Auriculares Premium" (18pt, Bold, blanco, centrado)
  2. Label descripción: "Sonido envolvente 7.1 con cancelación de ruido activa" (11pt, #aaa, centrado, wordWrap: true)
  3. Label precio: "$149.99" (24pt, Bold, #41CD52, centrado)
  4. Label detalle: "Auriculares inalámbricos con Bluetooth 5.2, batería de 40 horas, micrófono integrado y estuche de carga." (11pt, gris claro, wordWrap: true, centrado)
  5. Horizontal Line como separador
  6. Push Button "🛒 Agregar al Carrito":
    QPushButton {
        background-color: #41CD52;
        color: #1a1a2e;
        border: none;
        padding: 12px 24px;
        border-radius: 8px;
        font-weight: bold;
    }
    QPushButton:hover {
        background-color: #2D9B3E;
    }
    QPushButton:pressed {
        background-color: #1a7a2e;
    }
  1. Renombra todos los widgets
  2. Guarda como tarjeta_producto.ui
  3. Presiona Ctrl+R y verifica

---

Resultado Esperado

Una tarjeta de producto elegante con fondo oscuro, tipografía jerárquica, precio destacado en verde y un botón llamativo con efecto hover.

---

Checklist

  • [ ] Dialog de 400x350 con fondo oscuro
  • [ ] Frame con estilo de tarjeta (border-radius: 12px)
  • [ ] Nombre del producto (18pt, Bold)
  • [ ] Descripción breve (gris)
  • [ ] Precio destacado (24pt, verde)
  • [ ] Descripción detallada (wordWrap activado)
  • [ ] Separador horizontal
  • [ ] Botón con efecto hover
  • [ ] Layout Vertical dentro del Frame