2011-09-11 23 views
14

में एक QLabel के पाठ प्रतिपादन के लिए "टेक्स्ट-ओवरफ़्लो" मुझे एक विजेट में QLabel तत्व मिला है जिसका आकार बदला जा सकता है। टेक्स्ट सीमाओं को ओवरफ़्लो कर सकता है, इसलिए मुझे एप्लिकेशन को और अधिक सुरुचिपूर्ण दिखने के लिए, टेक्स्ट में आखिरी पूरी तरह से दिखाई देने वाले शब्द के बाद टेक्स्ट को इलिप्सिस (...) बनाने के लिए कुछ तरीका चाहिए।क्यूटी

एचटीएमएल/सीएसएस में लेआउट बनाना मैं इसके लिए text-overflow: ellipsis; का उपयोग करता था, लेकिन क्यूटी कक्षाओं के लिए मुझे इस पर कोई जानकारी नहीं मिली है।

उत्तर

32

ऐसा लगता है कि आपके लेबल resize event पर आप विजेट की नई चौड़ाई का उपयोग करके elided टेक्स्ट बना सकते हैं और टेक्स्ट रीसेट कर सकते हैं। स्ट्रिंग के elided संस्करण प्राप्त करने के लिए 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

इसके अलावा reimplementing '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

क्यूटी -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); 
    } 
}