2011-09-11 66 views
14

Tôi đã có phần tử QLabel trong một tiện ích có thể được thay đổi kích thước. Các văn bản có thể tràn ranh giới, vì vậy tôi cần, cho các ứng dụng trông thanh lịch hơn, một số cách để làm cho văn bản tạo ra một dấu chấm lửng (...) sau từ hoàn toàn có thể nhìn thấy cuối cùng trong văn bản."tràn văn bản" cho hiển thị văn bản của QLabel trong QT

Tạo bố cục trong HTML/CSS Tôi đã từng sử dụng text-overflow: ellipsis; cho điều này, nhưng đối với các lớp QT tôi chưa tìm thấy bất kỳ thông tin nào về điều này.

Trả lời

32

Dường như trên nhãn của bạn resize event bạn có thể tạo văn bản ưu tiên bằng chiều rộng mới của tiện ích và đặt lại văn bản. Sử dụng phương pháp QFontMetrix::elidedText để nhận phiên bản ưu tiên của chuỗi.

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

hy vọng điều này giúp, coi giải pháp

+0

Cũng xem xét reimplementing 'minimumSizeHint() 'với một cái gì đó như' trở QSize (0, QLabel :: minimumSizeHint(). Height()); '. Nếu không, nhãn không thể thay đổi kích cỡ bên dưới chiều rộng văn bản gốc. – kaveish

5

Tôi đã sửa đổi mô tả ở trên và tạo ra một chức năng:

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

Hy vọng nó sẽ hữu ích.

+0

thực sự có hầu như không có sự khác biệt, nhưng trừ một số chiều rộng không giúp một chút –

0

Qt-5 bao gồm example of an elided label class có thể là tham chiếu hữu ích khi triển khai của riêng bạn.

Từ ví dụ:

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); 
    } 
} 
Các vấn đề liên quan