Qt小部件的最小尺寸可容纳所有内容

Qt小部件的最小尺寸可容纳所有内容,qt,layout,resize,Qt,Layout,Resize,我希望有一个QWidget实例,它使用QHBoxLayout,并且(理想情况下是自动的,但调用一些函数也可以)水平调整大小以适应其内容。水平调整大小就足够了,因为包括容器本身在内的所有小部件都具有相同的高度 用例如下:小部件,我们称之为容器,是浮动的,即不是任何布局的一部分。用户应该能够(通过调用函数)向容器的布局中添加更多具有固定大小的小部件,容器在此基础上增长以适应其新内容。用户还应该能够删除先前添加的小部件,在该小部件上容器会再次收缩。直到第一个小部件被插入并删除,当最后一个小部件被删除时

我希望有一个
QWidget
实例,它使用
QHBoxLayout
,并且(理想情况下是自动的,但调用一些函数也可以)水平调整大小以适应其内容。水平调整大小就足够了,因为包括容器本身在内的所有小部件都具有相同的高度

用例如下:小部件,我们称之为容器,是浮动的,即不是任何布局的一部分。用户应该能够(通过调用函数)向容器的布局中添加更多具有固定大小的小部件,容器在此基础上增长以适应其新内容。用户还应该能够删除先前添加的小部件,在该小部件上容器会再次收缩。直到第一个小部件被插入并删除,当最后一个小部件被删除时,容器才会被创建,即它将始终包含至少一个小部件

例如:添加第一个小部件后,容器的左/右边框如下所示:

|<1st widget>|
||
在添加另一个后,看起来如下所示:

|<1st widget>  <2nd, longer widget>|
|<2nd, longer widget>|
||
删除第一个小部件后,它看起来如下所示:

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

我怀疑这应该有点简单,但我在容器的
sizeHint
sizePolicy
adjustSize()
、布局的
sizeContraint
以及多次明确设置大小和强制更新的尝试之间迷失了方向,基本上一无所获(即容器根本不调整大小,容器只会增长但不会收缩,等等)。我怀疑我一定错过了一些明显的东西。。

你的猜测是对的。必须为布局中的小部件设置大小策略。第一个小部件应该具有
QSizePolicy::Minimum
,第二个小部件应该具有
QSizePolicy::expansing
,以实现所需的效果。下面是一个示例应用程序:

#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();
}
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QPushButton*button1=新的QPushButton(“你好”);
按钮1->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Preferred);
QObject::connect(按钮1,信号(点击(bool)),按钮1,插槽(隐藏());
QPushButton*button2=新的QPushButton(“世界”);
按钮2->setSizePolicy(QSizePolicy::Expansing,QSizePolicy::Preferred);
QObject::connect(按钮2,信号(点击(bool)),按钮2,插槽(隐藏());
QHBoxLayout*布局=新的QHBoxLayout();
布局->添加小部件(按钮1);
布局->添加小部件(按钮2);
QWidget-main;
main.setLayout(布局);
main.show();
返回a.exec();
}

这很不直观!为什么
按钮2
应该与
按钮1
有不同的策略?他们是兄弟姐妹,行为完全相同。我有更复杂的
QFrame
层次结构和各种V/HBoxLayouts,我完全迷路了。。。