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.

Était-ce utile?

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top