Qt-виджет с минимальным размером для соответствия всему содержимому - программирование
Подтвердить что ты не робот

Qt-виджет с минимальным размером для соответствия всему содержимому

Я бы хотел иметь экземпляр QWidget, который использует QHBoxLayout и (в идеале автоматически, но при вызове некоторых функций тоже прекрасен) изменяет размер по горизонтали, чтобы соответствовать его содержимому. Горизонтальное изменение размера достаточно, так как все виджеты, включая сам контейнер, будут иметь одинаковую высоту.

Вариант использования следующий: виджет, пусть его называют контейнером, является плавающим, то есть не является частью какого-либо макета. Пользователь должен иметь возможность добавлять дополнительные виджеты с фиксированным размером (путем вызова функции) в макет контейнера, по которому контейнер растет, чтобы соответствовать его новому содержимому. Пользователь также должен иметь возможность удалить добавленный ранее виджет, после которого контейнер снова сжимается. Контейнер не будет создан до тех пор, пока первый виджет не будет вставлен и не удален, когда последний будет удален, т.е. Он будет содержать хотя бы один виджет.

Пример: после добавления первого виджета контейнер выглядит следующим образом: | является его левой/правой границей:

|<1st widget>|

После добавления другого, он выглядит следующим образом:

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

После удаления первого виджета он выглядит следующим образом:

|<2nd, longer widget>|

Я подозреваю, что это должно быть просто, но я потерялся где-то между контейнером sizeHint, sizePolicy, adjustSize() и его макетом sizeContraint, а также несколькими попытками с явным определением размера и форсирования обновлений и, по сути, никуда не годится (т.е. контейнер не изменяет размер вообще, контейнер растет, но не сокращается и т.д.). Я подозреваю, что я, должно быть, пропустил что-то вроде очевидного.?

4b9b3361

Ответ 1

Ваша догадка правильная. Нужно установить политики размеров для виджетов в макете. Первый виджет должен иметь 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();
}