"text-overflow" для текстового рендеринга QLabels в QT
У меня есть элемент QLabel в виджетах, размер которых можно изменить. Текст может переполнять границы, поэтому мне нужно, чтобы приложение выглядело более изящным, каким-то образом заставить текст генерировать многоточие (...) после последнего полностью видимого слова в тексте.
Создание макетов в HTML/CSS Я использовал для использования text-overflow: ellipsis;
для этого, но для классов QT я не нашел никакой информации об этом.
Ответы
Ответ 1
Похоже, на вашем мероприятии с изменением размера метки вы можете создать текст с использованием новой ширины виджета и сбросить текст. Используйте метод QFontMetrix :: elidedText, чтобы получить разрешенную версию строки.
QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);
надеюсь, это поможет,
Ответ 2
Я изменил решение, описанное выше, и создал функцию:
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);
}
Надеюсь, это будет полезно.
Ответ 3
Qt-5 включает в себя пример класса исключенных меток, который может быть полезной ссылкой при реализации вашего собственного.
Из примера:
elidedlabel.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);
}
}