您需要将标签的高度限制在绘制文本所需的最小值上。您可以使用QFontMetrics
类和方法QFontMetrics::boundingRect
来获取此高度:
QFontMetrics const fontMetrics(font());
QRect const r = fontMetrics.boundingRect(
QRect(QPoint(0, 0), size()),
Qt::TextWordWrap | Qt::ElideRight,
content
);
qDebug() << "Needed Height:" << r.height();
首先,定义方法QWidget::sizeHint
来强制设置标签的尺寸:
virtual QSize sizeHint() const override
{
QFontMetrics const fontMetrics(font());
QRect const r = fontMetrics.boundingRect(
QRect(QPoint(0, 0), size()),
Qt::TextWordWrap | Qt::ElideRight,
content
);
return QSize(width(), r.height());
}
我们只想要缩小高度。这就是为什么我们不会使用字体指标返回的宽度。
现在,我们将使用调整大小事件来检查是否可以缩小高度:
因此,我们可以覆盖QWidget::resizeEvent
方法:
virtual void resizeEvent(QResizeEvent* event) override
{
QFrame::resizeEvent(event);
QSize const size = sizeHint();
if (size.height() < height())
resize(QSize(width(), size.height()));
}
如果文本在运行时需要更改,我们必须重新调整大小:
void setText(const QString &newText)
{
content = newText;
update();
adjustSize();
}
我用于测试的代码:
QWidget* w = new QWidget();
QVBoxLayout* l = new QVBoxLayout(w);
QString const lorem("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
ElidedLabel* label = new ElidedLabel(lorem);
label->setFrameShape(QFrame::Box);
l->addWidget(label);
l->addWidget(new QLabel("Text Label"));
QTimer::singleShot(3000, [=]() { label->setText(lorem.left(100)); });
w->show();
WordWrap
属性为真的QLabel
不够吗? - Dimitry ErnotQLabel
不会省略。 - Jay