Gestión de interfaces redimensionables en Qt mediante el uso de QSplitter

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.

Etiquetas: Qt6 cpp QSplitter gui Layouts

Publicado el 7-11 02:22