У меня есть собственный виджет, который имеет общий макет QVBoxLayout. Он содержит несколько меток, QFormLayout, кнопку и отрезок, чтобы съесть все лишнее пространство. Один из ярлыков может быть довольно большим, поэтому я стараюсь, чтобы не было странных случаев, когда текст не читается. Виджет содержится в QScrollArea, чтобы гарантировать, что, если пользователь сжимает общее окно, все аспекты виджета все еще могут быть видны.
QLabel, кажется, отлично меняет размер, но как только он достигает определенной точки узости, он просто обрезает несколько нижних строк метки и выделяет пространство для растяжки в нижней части виджета.
Я делаю все это в коде без конструктора, поэтому вполне возможно, что я что-то упускаю. Подкомпоненты добавляются к общему QVBoxLayout в следующем порядке:
OverallLayout = new QVBoxLayout(this);
Title = new QLabel();
Description = new QLabel();
SubRegion = new QFormLayout();
Button = new QButton();
...
// set text values, wordWrap(true), and Font for labels
OverallLayout->addWidget(Title);
OverallLayout->addWidget(Description);
OverallLayout->addLayout(SubRegion);
OverallLayout->addStrut(MIN_DIST);
OverallLayout->addWidget(Button);
OverallLayout->addStretch(STRETCH_FACTOR);
Результаты теста. Изучая результаты, возвращаемые функцией sizeHint () QLabel, возвращаемые значения не изменяются, поскольку виджет сокращается по горизонтали. Тем не менее, QLabel расширяется, занимая больше вертикального пространства (153 против намека на 103), но этого недостаточно для размещения всего текста. Когда QLabel впервые показывается, у него меньше пикселей, чем его sizeHint, но все же достаточно для его значения heightForWidth. Когда его размер изменяется, он имеет на 30 меньше значения heightForWidth, но больше его sizeHint.
Я проверил, и большой QLabel имеет значения hasHeightForWidth () и wordWrap (), установленные в true. Что я делаю неправильно?
Я закончил тем, что пошел с методом перезаписи виджета resizeEvent(QResizeEvent *evt)
функция для того, чтобы установить максимальное значение QLabel динамически.
void MyWidget::resizeEvent (QResizeEvent *evt) {
int newHeight = Description.heightForWidth(Description.width());
Description.setMaximumHeight(newHeight);
QWidget::resizeEvent(evt);
// Note: I'm not sure if this last step is necessary
}
Интересно отметить, что если вы делаете оба setMinimumHeight(newHeight)
а также setMaximumHeight(newHeight)
метка будет расти вертикально, чтобы соответствовать тексту, но она никогда не будет уменьшаться, когда метка растет горизонтально и не требует дополнительного пространства. Я думаю, что heightForWidth(int w)
возвращает максимум между минимальной высотой виджета и фактически необходимыми пикселями. Странная часть заключается в том, что, похоже, не нужно возвращать значение, превышающее текущее значение MaximumHeight.
Других решений пока нет …