当启用自动换行时,QLabel的sizeHint()大小不正确。

4
我有一个启用了自动换行的自定义QLabel。当调整大小时,它会自动换行,但sizeHint()仍然返回原始高度。 我尝试了这篇文章中的修复方法:QLabel cutting off text on resize,但标签的sizeHint()仍然返回初始高度,并导致文本被截断。
为了使TestLabel返回正确的sizeHint(),我需要做什么?
    MyWidget::MyWidget(QWidget *parent)
    : QFrame(parent)
    {
        label = new TestLabel(this);
        label ->setWordWrap(true);
        label ->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        mLayout->addWidget(label);
    }


    void MyWidget::resizeEvent( QResizeEvent * event )
    {
       int height = label->heightForWidth(label->width());
       label->setMaximumHeight(height);
       //label->setMinimumHeight(height); // gets called all the time
       label->updateGeometry();
       QFrame::resizeEvent(event);
    }

TestLabel类的sizeHint()函数:

    QSize TestLabel::sizeHint() const
    {
       QSize s = QLabel::sizeHint();
       qDebug() << "sizeHint(): " << text() << ": " << s;
       return s;
    }

    QSize TestLabel::minimumSizeHint() const
    {
       QSize s = QLabel::sizeHint();
       qDebug() << "minimumSizeHint(): " << text() << ": " << s;
       return s;
    }

sizeHint()是指示布局系统的指标,表示小部件希望使用多少空间,如果它拥有全世界的所有空间。启用或禁用换行对此没有影响,它只会在QLabel未获得其请求的布局大小时更改其行为。 - Chris
1个回答

0

曾经我遇到了关于QLabel大小提示的问题——在QLabel文本更改后,它没有被更新,而我需要在文本更改后立即得到它(使用字体度量获取文本宽度无法得到精确的像素大小)。有一个小技巧帮助了我——我对包含该标签的布局层次结构中的所有布局调用invalidate()和activate()函数——从最内层到最外层(按照这个顺序)。此后,调用标签大小提示的函数返回了新的正确值。我记得这两个函数中的一个足够了,不过我不记得是哪一个了。如果你曾经看过Qt中它们的代码的话,你就知道,布局是相当混乱的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接