Установка текста в QLabel в макете не изменяет размер

Используя конструктор в создателе Qt, я создал диалоговое окно, содержащее различные виджеты в вертикальном макете. Одним из виджетов является QLabel со словом wrap, установленным в true. Текст для QLabel устанавливается непосредственно перед отображением диалога.

Максимальная ширина и высота QLabel равна 16777215, для политики вертикального размера установлено значение Расширение, а горизонтальное - Предпочтительно. Я попытался изменить политику размера.

Проблема заключается в том, что если текст большой, QLabel не может быть соответствующим образом скорректирован, а текст обрезается следующим образом: -

enter image description here

Я попытался вызвать updateGeometry() для диалога после установки текста, а также попытался вызвать обновление по вертикальной компоновке, но ничего не имеет никакого значения. В идеале я хочу, чтобы QLabel настраивался вертикально для размещения текста.

Может ли кто-нибудь сказать мне, что мне здесь не хватает?

Ответ 1

Установите вертикальную sizepolicy вашей метки на QSizePolicy::Minimum. Затем установите sizeconstraint вашего диалогового макета на QLayout::SetMinimumSize. Это должно привести к тому, что ваш диалог будет расти, поэтому весь контент поместится внутри него.

Что-то вроде этого:

QVBoxLayout *layout = new QVBoxLayout;
layout->setSizeConstraint(QLayout::SetMinimumSize);
this->setLayout(layout);
for(int i = 0; i < 5; i++)
{
    QLabel *label = new QLabel;
    label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
    label->setWordWrap(true);
    label->setText("This is a very long text. This is a very long text. This is a very long text. "
                   "This is a very long text. This is a very long text. This is a very long text. This is a very long text. "
                   "This is a very long text. This is a very long text.");
    layout->addWidget(label);
}

Ответ 2

В моих экспериментах просто установить свойство layoutSizeConstraint на SetMinimumSize в макете, содержащей QLabel, должно быть достаточно, чтобы метка расширялась и настраивалась на ее содержимое.

Вы можете либо изменить это свойство в Qt Designer, если вы использовали его для создания пользовательского интерфейса или через код:

layout->setSizeConstraint(QLayout::SetMinimumSize);

Обратите внимание, что если у вас есть вложенные макеты, вам может потребоваться установить ограничение во всех макетах вверх по цепочке. Не требуется никаких изменений для метки sizePolicy - значения по умолчанию (Preferred для политики по горизонтали и по вертикали) должны работать, по крайней мере, в моем опыте.