2011-09-11 17 views
14

Ho un elemento QLabel in un widget che può essere ridimensionato. Il testo può oltrepassare i limiti, quindi ho bisogno che l'applicazione abbia un aspetto più elegante, un modo per far sì che il testo generi un'ellissi (...) dopo l'ultima parola totalmente visibile nel testo."overflow di testo" per il rendering di testo di una QLabel in QT

Creazione di layout in HTML/CSS Ho usato lo text-overflow: ellipsis; per questo, ma per le classi QT non ho trovato alcuna informazione al riguardo.

risposta

32

Sembra che sull'etichetta resize event sia possibile creare testo eliso utilizzando la nuova larghezza del widget e reimpostare il testo. Utilizzare il metodo QFontMetrix::elidedText per ottenere la versione elided 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); 

speranza che questo aiuti, riguarda soluzione

+0

Considera anche reimplementare 'minimumSizeHint()' con qualcosa come 'ritornare qsize (0, . :: QLabel minimumSizeHint() altezza()); '. In caso contrario, l'etichetta non può essere ridimensionata al di sotto della larghezza del testo originale. – kaveish

5

Ho modificato descritto in precedenza e ha 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 sarà utile.

+0

in realtà non c'è quasi differenza, ma sottrarre una certa larghezza aiuta un po ' –

0

Qt-5 include uno example of an elided label class che può essere un utile riferimento 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); 
    } 
} 
Problemi correlati