具有最小尺寸的Qt小部件以适合所有内容

rai*_*ner 18 layout qt resize

我想有一个QWidget实例使用a QHBoxLayout和(理想情况下自动调用某些函数也很好)水平调整大小以适应其内容.水平调整大小就足够了,因为所有小部件(包括容器本身)都具有相同的高度.

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

一个例子:添加第一个小部件后,容器看起来像这样,|左边/右边框:

|<1st widget>|
Run Code Online (Sandbox Code Playgroud)

添加另一个后,它看起来像这样:

|<1st widget>  <2nd, longer widget>|
Run Code Online (Sandbox Code Playgroud)

删除第一个小部件后,它看起来像这样:

|<2nd, longer widget>|
Run Code Online (Sandbox Code Playgroud)

我猜想,这应该是一种简单的,但我得到了什么地方丢失了其间的容器的sizeHint,sizePolicy,adjustSize(),它的平面布局的sizeContraint,以及与explitely设置大小,并迫使更新和基本多次尝试无处(即容器没有调整可言,容器只能增长但不会缩小等).我怀疑我一定错过了一些明显的东西..?

div*_*nov 9

你的猜测是正确的.必须为布局中的窗口小部件设置大小策略.第一个小部件应该有QSizePolicy::Minimum,第二个小部件必须QSizePolicy::Expanding达到预期的效果.这是一个示例应用程序:

#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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这是非常不直观的!为什么“button2”应该有与“button1”不同的策略?他们是兄弟姐妹,有着完全相同的行为。我有更复杂的“QFrame”层次结构和各种 V/HBoxLayouts,我完全迷失了...... (2认同)