«Text-dépliant» pour un texte de texte de QLabel en QT
-
28-10-2019 - |
Question
J'ai un élément QLabel dans un widget qui peut être redimensionné. Le texte peut déborder de limites, donc j'ai besoin, que l'application soit plus élégante, un moyen de faire en sorte que le texte génére une ellipse (...) après le dernier mot totalement visible dans le texte.
Faire des dispositions dans HTML / CSS que j'utilisais text-overflow: ellipsis;
Pour cela, mais pour les classes QT, je n'ai trouvé aucune information à ce sujet.
La solution
Ça ressemble sur ton label Événement de redimensionnement Vous pouvez créer du texte élidé en utilisant la nouvelle largeur du widget et réinitialiser le texte. Utilisation Qfontmetrics :: elidedText Méthode pour obtenir la version élidée de la chaîne.
QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);
J'espère que cela aide, ce qui concerne
Autres conseils
J'ai modifié la solution décrite ci-dessus et j'ai créé une fonction:
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);
}
J'espère que ce sera utile.
Qt-5 comprend un Exemple d'une classe d'étiquettes élidée qui peut être une référence utile lors de la mise en œuvre de la vôtre.
De l'exemple:
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;
};
eidedLabel.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);
}
}