2011-09-11 69 views
14

我已經在可以調整大小的小部件中有一個QLabel元素。文本可以溢出邊界,所以我需要使應用程序看起來更加優雅,以便使文本在文本中最後一個完全可見的單詞之後生成省略號(...)。「文本溢出」QLabel在QT中的文本呈現

在HTML/CSS中製作佈局我以前爲此使用text-overflow: ellipsis;,但對於QT類,我還沒有找到任何關於此的信息。

回答

32

它看起來像您的標籤resize event您可以使用小部件的新寬度創建消減文本並重置文本。使用QFontMetrix::elidedText方法來獲取字符串的消隱版本。

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

希望這會有所幫助,對於上述

+0

也可以考慮重新實現'的minimumSizeHint()'喜歡的東西'返回QSIZE(0, 。QLabel ::的minimumSizeHint()高度());'。否則,標籤不能在原始文本寬度以下調整大小。 – kaveish

5

我修改的解決方案,並創建了一個功能:

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

希望這將是有益的。

+0

實際上幾乎沒有區別,但減去一些寬度確實有一點幫助 –

0

Qt-5包含一個example of an elided label class,它在實現您自己的時候可能是一個有用的參考。

從例如:

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