启用wordwrap时qlabel的sizeHint()错误

时间:2013-04-08 19:50:18

标签: qt qlabel

我有一个启用了wordwrap的自定义QLabel。调整 MyWidget 的大小时,它会换行,但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;
    }

1 个答案:

答案 0 :(得分:0)

一旦我遇到QLabel大小提示问题 - 在更改QLabel文本后它没有更新,我在文本更改后立即需要它(使用字体指标获取文本宽度不会给出像素精确的大小未来的标签)。有一个技巧帮助了我 - 我为包含该标签的布局层次结构中的所有布局调用了invalidate()和activate() - 从最内层到最外层(完全按照该顺序)。之后,对标签的sizeHint()的调用返回了新的正确的。我记得那两个功能中的一个就够了,我不记得哪一个了。如果你看过他们的代码,那么布局在Qt中是一个非常混乱的部分。