tutorial español curso qt layout resize

qt - curso - tutorial qgis 2.18 español pdf



Qt widget con tamaño mínimo para adaptarse a todos los contenidos (1)

Me gustaría tener una instancia de QWidget que use un QHBoxLayout y (idealmente de forma automática, pero al llamar a alguna función también está bien) cambia el tamaño horizontalmente para ajustarse a su contenido. El cambio de tamaño horizontal es suficiente ya que todos los widgets, incluido el contenedor en sí, tendrán la misma altura.

El caso de uso es el siguiente: el widget, llamémoslo contenedor, está flotando, es decir, no forma parte de ningún diseño. Un usuario debe poder agregar más widgets con un tamaño fijo (llamando a una función) al diseño del contenedor, sobre el cual el contenedor crece para adaptarse a sus nuevos contenidos. El usuario también debe poder eliminar un widget previamente agregado, sobre el cual el contenedor se contrae nuevamente. El contenedor no se creará hasta que el primer widget se inserte y se elimine cuando se elimine el último, es decir, siempre contendrá al menos un widget.

Un ejemplo: después de agregar el primer widget, el contenedor se ve así, con | siendo sus bordes de izquierda / derecha:

|<1st widget>|

Después de agregar otro, se ve así:

|<1st widget> <2nd, longer widget>|

Después de eliminar el primer widget, se ve así:

|<2nd, longer widget>|

Sospecho que esto debería ser un poco simple, pero me perdí en algún lugar entre el sizeHint del contenedor sizeHint , sizePolicy , adjustSize() , y el sizeContraint del sizeContraint , así como varios intentos para establecer explícitamente el tamaño y forzar las actualizaciones y esencialmente no llegar a ninguna parte (es decir, el contenedor sin cambiar el tamaño, el contenedor solo crece pero no se encoge, etc). Sospecho que debo haber pasado por alto algo obvio ..?


Tu conjetura es correcta. Uno tiene que establecer políticas de tamaño para los widgets en un diseño. El primer widget debe tener QSizePolicy::Minimum y el segundo debe tener QSizePolicy::Expanding para lograr el efecto deseado. Aquí hay una aplicación de muestra:

#include <QtGui> int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton *button1 = new QPushButton("Hello"); button1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); QObject::connect(button1, SIGNAL(clicked(bool)), button1, SLOT(hide())); QPushButton *button2 = new QPushButton("World"); button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); QObject::connect(button2, SIGNAL(clicked(bool)), button2, SLOT(hide())); QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(button1); layout->addWidget(button2); QWidget main; main.setLayout(layout); main.show(); return a.exec(); }