Вы должны ограничить высоту вашего ярлыка до минимума, необходимого для рисования текста. Вы можете получить эту высоту, используя класс 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); // Process the event. The label is now resized
QSize const size = sizeHint();
if (size.height() < height()) // Shrink the height if needed
resize(QSize(width(), size.height()));
}
Если текст должен измениться во время выполнения, мы должны перенастроить размер:
void setText(const QString &newText)
{
content = newText;
update();
adjustSize(); // Will resize the label
}
Код, который я использовал для тестов:
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); // To see its bounds
l->addWidget(label);
l->addWidget(new QLabel("Text Label"));
QTimer::singleShot(3000, [=]() { label->setText(lorem.left(100)); });
w->show();