qt - ejemplo - análisis de la disponibilidad y el costo de los suministros e insumos
¿Cómo tener un diseño de tamaño fijo que también impida que la ventana cambie de tamaño? (1)
Tengo un widget contenedor.
Sus políticas de tamaño son "fijas" (tanto verticales como horizontales). tiene setMaxmimumWidth y setMaximumHeight definidos.
Puse un contenedor QHBoxLayout allí. agregándole widgets (con ancho / alto fijo también). Pero cuando llamo "Mostrar", nada de esto se respeta. La altura es casi aleatoria, no coincide con ninguno de los widgets internos en el diseño, el doble del tamaño del elemento más alto, y el ancho de mi contenedor se estira más allá del ancho fijo.
¿Qué me estoy perdiendo? ¿Por qué el contenedor no puede permanecer con un ancho / alto fijo como lo definí? ¿Por qué el diseño interfiere con él y no respeta sus restricciones?
La confusión proviene del hecho de que los widgets que tienen tamaños fijos sí tienen tamaños fijos. Se mantiene lo siguiente: si un diseño solo tiene widgets de tamaño fijo, entonces el tamaño general del diseño se fija nominalmente, y los widgets dentro de él no pueden crecer. Si lo establece como un diseño en una ventana, puede restringir el crecimiento de la ventana si establece la restricción SetFixedSize
en ella. Es inútil establecer cualquier tipo de políticas de tamaño en una ventana con un diseño que solo tenga elementos de tamaño fijo , a menos que desee aumentar el espacio entre los widgets.
Si desea que sus widgets permanezcan en tamaño fijo, pero el espacio entre ellos aumente , el único cambio necesario en el código a continuación es configurar todos los widgets a una política de tamaño fijo. Como no pueden crecer, el espacio es lo único que puede. QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)
literalmente todas las políticas en el ejemplo en QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)
y obtendrá este comportamiento.
Si desea widgets de un cierto tamaño mínimo y capacidad de crecimiento, y el widget de contenedor general de un cierto tamaño mínimo, simplemente configúrelo. Esto significa:
Establezca el tamaño mínimo, máximo o fijo o el ancho / alto en el widget de contenedor.
Establezca los tamaños o anchos / alturas mínimos, máximos o fijos en los widgets.
Establezca las políticas de tamaño en los widgets para reflejar el comportamiento que desea. Es posible que desee, por ejemplo, que algunos de los widgets crezcan solo en ciertas direcciones, o no lo hagan.
Al menos un widget deberá crecer en una dirección determinada si establece el tamaño mínimo en el contenedor. Por lo tanto, si establece el ancho en el contenedor, al menos un widget diseñado debe poder expandirse horizontalmente para llenarlo. Si establece la altura en el contenedor, al menos un widget distribuido debe poder expandirse verticalmente para llenarlo.
Lo siguiente funciona bien bajo Qt 4.8.5 y 5.1.1. La ventana se puede expandir pero no contraer, tiene un tamaño mínimo. Puede cambiar setMinimumSize
a setFixedSize
para obtener una ventana con un tamaño fijo, o puede establecer tamaños mínimos y máximos.
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QFontDatabase>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget window;
QHBoxLayout layout(&window);
QLabel lbl1("one");
lbl1.setStyleSheet("QLabel { background-color: #FF8080 }");
lbl1.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
QLabel lbl2("two");
lbl2.setStyleSheet("QLabel { background-color: #80FF80 }");
lbl2.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
lbl2.setMinimumHeight(300);
QLabel lbl3("three");
lbl3.setStyleSheet("QLabel { background-color: #8080FF }");
lbl3.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
lbl3.setMinimumWidth(300);
layout.addWidget(&lbl1);
layout.addWidget(&lbl2);
layout.addWidget(&lbl3);
window.setMinimumSize(800, 800);
// Any combination of setMinimumSize and setMaximumSize is OK.
// If the minimum and maximum are the same, just do setFixedSize
window.show();
return a.exec();
}