QLABEL切断调整大小的文本

QLabel cutting off text on resize

本文关键字:文本 调整 QLABEL      更新时间:2023-10-16

我有一个自定义窗口小部件,该窗口部门具有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);

测试结果:检查从Qlabel的sizeHint()函数返回的结果,返回的值似乎没有变化,因为小部件水平缩小。但是,Qlabel确实会扩展以占用更多的垂直房间(153 vs的提示为103),这不足以适合所有文本。首先显示Qlabel时,它的像素比尺寸较小,但仍足以达到其高度宽度。调整大小时,它比其高度低30个,但比大小的尺寸要大。

我已经检查了,并且大型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)返回小部件的最小值和实际需要的像素之间的最大值。奇怪的部分是它似乎不在乎返回大于当前最大值的值。