La clase QSplitter, que hereda de QFrame, es una herramienta fundamental en el desarrollo de interfaces gráficas con Qt. Permite al usuario final ajustar el tamaño de los widgets secundarios arrastrando una barra divisoria (handle) situada entre ellos.
Instanciación y Orientación
El comportamiento principal de un divisor se define por su orientcaión, ya sea para organizar elementos en columnas o en filas.
// Creación de un divisor vertical (elementos uno sobre otro)
QSplitter *vSplitter = new QSplitter(Qt::Vertical);
// Creación de un divisor horizontal (elementos lado a lado)
QSplitter *hSplitter = new QSplitter(Qt::Horizontal);
Incorporación de Widgets
Existen dos métodos comunes para integrar componentes dentro de un QSplitter:
1. Mediante el constructor del widget hijo
// Al pasar el splitter como padre, el widget se añade automáticamente
QTextEdit *areaTexto = new QTextEdit("Panel Superior", vSplitter);
QListWidget *listaItems = new QListWidget(vSplitter);
2. Utilizando el método addWidget
QPushButton *botonAceptar = new QPushButton("Aceptar");
QPushButton *botonCancelar = new QPushButton("Cancelar");
hSplitter->addWidget(botonAceptar);
hSplitter->addWidget(botonCancelar);
Integración en Diseños (Layouts)
Para que un QSplitter se adapte correctaemnte a una ventana principal, suele insertarse dentro de un layout estándar.
QVBoxLayout *contenedorPrincipal = new QVBoxLayout;
contenedorPrincipal->addWidget(vSplitter);
this->setLayout(contenedorPrincipal);
Configuración de Propiedades
El comportamiento del divisor se puede ajustar mediante diversas propiedades integradas:
- setChildrenCollapsible: Determina si los widgets pueden reducir su tamaño hasta desaparecer (0 píxeles). ```
vSplitter->setChildrenCollapsible(false); // Evita que los widgets se oculten totalmente
- setHandleWidth: Ajusta el grosor de la línea divisoria. ```
vSplitter->setHandleWidth(8); // Grosor de 8 píxeles
- setOpaqueResize: Define si el contenido se redibuja en tiempo real mientras se arrastra el divisor. ```
vSplitter->setOpaqueResize(true); // Redimensionamiento fluido
Funciones de Control y Estado
Gestión de expansión (Stretch Factor)
Permite priorizar qué componente debe crecer cuando el formulario cambia de tamaño.
// El segundo elemento (índice 1) será el que se expanda preferentemente
vSplitter->setStretchFactor(1, 1);
Persistencia de la Interfaz
Es posible almacenar y recuperar la posición exacta de los divisores para mejorar la experiencia de usuario en sesiones futuras.
// Guardar configuración
QByteArray configuracion = vSplitter->saveState();
// Restaurar configuración (por ejemplo, desde QSettings)
vSplitter->restoreState(configuracion);
Control de dimensiones específicas
Se pueden definir los tamaños iniciales de todos los elementos de forma masiva.
QList<int> medidas;
medidas << 200 << 500;
vSplitter->setSizes(medidas);
Manipulación Avanzada: Bloqueo de Movimiento
En ciertos escenarios, es posible que se desee mostrar la línea divisoria pero impedir que el usuario la mueva manualmente.
// Obtener el manejador (handle) entre el primer y segundo widget
QSplitterHandle *manejador = vSplitter->handle(1);
if (manejador) {
manejador->setEnabled(false); // Bloquea la interacción del usuario con la barra
}
Resumen de Métodos Útiles
| Método | Descirpción |
|---|---|
count() |
Devuelve el número de widgets dentro del splitter. |
indexOf(QWidget*) |
Retorna la posición de un widget específico. |
replaceWidget(int, QWidget*) |
Sustituye un componente por otro en el índice indicado. |
setCollapsible(int, bool) |
Configura si un widget individual es colapsable. |