2011-09-11 5 views
14

크기를 조정할 수있는 위젯에 QLabel 요소가 있습니다. 텍스트가 경계를 초과 할 수 있으므로, 애플리케이션이 더 우아하게 보이도록하려면 텍스트에서 마지막으로 완전히 보이는 단어 다음에 줄임표 (...)를 텍스트에 생성하는 몇 가지 방법이 필요합니다.QT에서 QLabel의 텍스트 렌더링을위한 "text-overflow"

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(). height());'. 그렇지 않으면 원래 텍스트 너비 아래에서 레이블의 크기를 조정할 수 없습니다. – 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); 
    } 
} 
관련 문제