Frage

Ich habe ein QLabel-Element in einem Widget, dessen Größe geändert werden kann.Der Text kann Grenzen überschreiten, daher muss die Anwendung eleganter aussehen, damit der Text nach dem letzten vollständig sichtbaren Wort im Text eine Ellipse (...) erzeugt.

Erstellen von Layouts in HTML / CSS Ich habe dafür text-overflow: ellipsis; verwendet, aber für QT-Klassen habe ich keine Informationen dazu gefunden.

War es hilfreich?

Lösung

Es sieht so aus, als ob auf Ihrem Etikett Größenänderungsereignis Sie können elidierten Text mit der neuen Breite des Widgets erstellen und den Text zurücksetzen.Verwenden Sie die QFontMetrics :: elidedText -Methode, um die Elided zu erhaltenVersion der Zeichenfolge.

QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);

hoffe das hilft, Grüße

Andere Tipps

Ich habe oben beschriebene Lösung geändert und eine Funktion erstellt: generasacodicetagpre.

hoffe es wird nützlich sein.

Qt-5 enthält ein Beispiel für eine elided label-Klasse Dies kann eine nützliche Referenz bei der Implementierung Ihrer eigenen sein.

Aus dem Beispiel:

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);
    }
}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top