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

С помощью дизайнера в Qt Creator я создал диалоговое окно, содержащее различные виджеты в вертикальном расположении. Один из виджетов — это QLabel с переносом слов, для которого задано значение true. Текст для QLabel устанавливается непосредственно перед отображением диалогового окна.

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

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

введите здесь описание изображения

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

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


person TheDarkKnight    schedule 10.10.2013    source источник
comment
Пробовали ли вы вызывать QWidget::adjustSize() ?   -  person thuga    schedule 10.10.2013
comment
Да, но это все равно не имеет значения.   -  person TheDarkKnight    schedule 10.10.2013


Ответы (2)


Установите политику вертикального размера вашего ярлыка на QSizePolicy::Minimum. Затем установите ограничение размера макета вашего диалогового окна на 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);
}
person thuga    schedule 10.10.2013
comment
Спасибо, но это не работает. Теперь текст занимает всего две строки, а остальная часть текста усекается; здесь должно быть что-то еще. - person TheDarkKnight; 10.10.2013
comment
@ Merlin069 Это странно. Хотя пример должен работать. Можете ли вы произвести SSCE? - person thuga; 10.10.2013
comment
Хорошо, у меня наконец-то это работает; установка политики размера метки на QSizePolicy::MinimumExpanding сделала это, хотя я не уверен, почему. Я также ожидал, что QSizePolicy::Minimum будет работать. Спасибо за помощь. - person TheDarkKnight; 10.10.2013
comment
@ Merlin069 О. Хорошо знать. Это странно. - person thuga; 10.10.2013
comment
@ Merlin069, пожалуйста, обновите свой ответ, если кто-то ищет решение, чтобы просто проверить ваш ответ без необходимости переходить к комментариям. :) - person Zdravko Donev; 25.01.2017

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

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

layout->setSizeConstraint(QLayout::SetMinimumSize);

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

person waldyrious    schedule 16.05.2017