[Qt-interest] layout problems with QLabel with automatic eliding

Andrew Batishko abatishko at attensity.com
Mon Aug 17 20:01:40 CEST 2009


Thank you. It looks like I was missing a proper sizeHint() 
implementation. It seems obvious in retrospect.

Andrew

David Boosalis wrote:
> Hi Andrew.
> 
> Take a look at KDE's KSqueezedTextLabel, which is based on QLabel.
> http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKSqueezedTextLabel.html
> 
> -David
> 
> 
> On Thu, Aug 13, 2009 at 9:58 AM, Andrew Batishko<abatishko at attensity.com> wrote:
>> I wanted a class that would allow me to display a label that would take
>> up as much space as possible without forcing the window to resize, and
>> would automatically elide if the text was longer than could be
>> displayed. I came up with the class below.
>>
>> The problem is that this only works properly for cases where the label
>> is placed in a QVBoxLayout, or in a QHBoxLayout where it's the only item
>> in the layout with a stretch factor of 1.
>>
>> This means that it doesn't work (for example) in a case where you want
>> the label immediately followed (no extra space) by a "..." button, and
>> then followed by extra unused space, something such as the following
>> where "val1, val2, val3" are the auto-eliding label part.
>>
>> |                                                           |
>> | Items: val1, val2, val3 [...]                 [] checkbox |
>> |                                                           |
>>
>> Has anyone successfully put something like this together or have any
>> ideas on how to accomplish this? I've tried messing around with various
>> options on size policies and such, but with no luck.
>>
>> Andrew
>>
>> class AutoSizeLabel:public QLabel {
>>   Q_OBJECT
>>  public:
>>   AutoSizeLabel(const QString &text, QWidget *parent):QLabel(parent, f) {
>>     setSizePolicy(QSizePolicy(QSizePolicy::Ignored,
>> QSizePolicy::Preferred));
>>     setText(text);
>>   }
>>
>>   QString text(void) const { return fullText; }
>>
>>  public slots:
>>   void setText(const QString &newText) {
>>     fullText = newText;
>>     QString elided = fontMetrics().elidedText(fullText, Qt::ElideRight,
>> width());
>>     if (elided == fullText) {
>>       setToolTip(QString());
>>       QLabel::setText(fullText);
>>     }
>>     else {
>>       setToolTip(fullText);
>>       QLabel::setText(elided);
>>     }
>>   }
>>
>>  protected:
>>   virtual void resizeEvent(QResizeEvent *) {
>>     setText(fullText);
>>   }
>>
>>  private:
>>   QString fullText;
>> };
>>
>>
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at trolltech.com
>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>




More information about the Qt-interest-old mailing list