4

我有一个启用了自动换行的自定义 QLabel。调整MyWidget的大小时,它会换行,但 sizeHint() 仍会返回原始高度。我尝试了这篇文章的修复:QLabel 在调整大小时切断文本,但标签的 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;
    }
4

1 回答 1

0

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

于 2013-08-21T14:22:46.193 回答