“переполнение текста” для рендеринга текста QLabel в QT
-
28-10-2019 - |
Вопрос
У меня есть элемент QLabel в виджете, размер которого можно изменять.Текст может выходить за границы, поэтому мне нужно, чтобы приложение выглядело более элегантно, каким-то образом заставить текст генерировать многоточие (...) после последнего полностью видимого слова в тексте.
Создание макетов в HTML/CSS, которые я раньше использовал text-overflow: ellipsis;
для этого, но для классов QT я не нашел никакой информации по этому поводу.
Решение
Это выглядит так, как указано на вашем ярлыке событие изменения размера вы можете создать пропущенный текст, используя новую ширину виджета, и сбросить текст.Воспользуйся QFontMetrics::Удаленный текст метод для получения исключенной версии строки.
QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);
надеюсь, это поможет, с уважением
Другие советы
Я изменил решение, описанное выше, и создал функцию:
static void SetTextToLabel(QLabel *label, QString text)
{
QFontMetrics metrix(label->font());
int width = label->width() - 2;
QString clippedText = metrix.elidedText(text, Qt::ElideRight, width);
label->setText(clippedText);
}
Надеюсь, это будет полезно.
Qt-5 включает в себя пример исключенного класса меток который может быть полезной ссылкой при реализации вашего собственного.
Из примера:
удаленная метка.h:
class ElidedLabel : public QFrame
{
Q_OBJECT
Q_PROPERTY(QString text READ text WRITE setText)
Q_PROPERTY(bool isElided READ isElided)
public:
explicit ElidedLabel(const QString &text, QWidget *parent = 0);
void setText(const QString &text);
const QString & text() const { return content; }
bool isElided() const { return elided; }
protected:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
signals:
void elisionChanged(bool elided);
private:
bool elided;
QString content;
};
elidedlabel.cpp:
ElidedLabel::ElidedLabel(const QString &text, QWidget *parent)
: QFrame(parent)
, elided(false)
, content(text)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}
void ElidedLabel::setText(const QString &newText)
{
content = newText;
update();
}
void ElidedLabel::paintEvent(QPaintEvent *event)
{
QFrame::paintEvent(event);
QPainter painter(this);
QFontMetrics fontMetrics = painter.fontMetrics();
bool didElide = false;
int lineSpacing = fontMetrics.lineSpacing();
int y = 0;
QTextLayout textLayout(content, painter.font());
textLayout.beginLayout();
forever {
QTextLine line = textLayout.createLine();
if (!line.isValid())
break;
line.setLineWidth(width());
int nextLineY = y + lineSpacing;
if (height() >= nextLineY + lineSpacing) {
line.draw(&painter, QPoint(0, y));
y = nextLineY;
//! [2]
//! [3]
} else {
QString lastLine = content.mid(line.textStart());
QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width());
painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine);
line = textLayout.createLine();
didElide = line.isValid();
break;
}
}
textLayout.endLayout();
if (didElide != elided) {
elided = didElide;
emit elisionChanged(didElide);
}
}