"Text-overflow" per il rendering del testo di una QLabel in QT
-
28-10-2019 - |
Domanda
Ho un elemento QLabel in un widget che può essere ridimensionato.Il testo può superare i limiti, quindi, affinché l'applicazione abbia un aspetto più elegante, è necessario un modo per fare in modo che il testo generi un'ellissi (...) dopo l'ultima parola totalmente visibile nel testo.
Realizzando layout in HTML / CSS usavo text-overflow: ellipsis;
per questo, ma per le classi QT non ho trovato alcuna informazione al riguardo.
Soluzione
Sembra che sulla tua etichetta resize event puoi creare testo eliso usando la nuova larghezza del widget e reimpostare il testo.Utilizza il metodo QFontMetrics :: elidedText per ottenere il metodo elidedversione della stringa.
QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);
spero che questo aiuti, saluti
Altri suggerimenti
Ho modificato la soluzione sopra descritta e ho creato una funzione:
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);
}
Spero che sia utile.
Qt-5 include un esempio di una classe di etichette elided che può essere un riferimento utile quando si implementa il proprio.
Dall'esempio:
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);
}
}