2013-04-08 2 views
3

У меня есть пользовательский QLabel с включенным wordwrap. При изменении размера MyWidget, он обертывает, но sizeHint() по-прежнему возвращает исходную высоту. Я испробовал исправление из этого сообщения: QLabel cutting off text on resize, но метка размераHint() по-прежнему возвращает начальную высоту и приводит к обрезанию текста.qlabel имеет неправильный размерHint(), когда включена функция wordwrap.

Что мне нужно сделать, чтобы вернуть TestLabel правильный размерHint()?

MyWidget::MyWidget(QWidget *parent) 
    : QFrame(parent) 
    { 
     label = new TestLabel(this); 
     label ->setWordWrap(true); 
     label ->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); 
     mLayout->addWidget(label); 
    } 


    void MyWidget::resizeEvent(QResizeEvent * event) 
    { 
     int height = label->heightForWidth(label->width()); 
     label->setMaximumHeight(height); 
     //label->setMinimumHeight(height); // gets called all the time 
     label->updateGeometry(); 
     QFrame::resizeEvent(event); 
    } 

sizeHint() класса TestLabel:

QSize TestLabel::sizeHint() const 
    { 
     QSize s = QLabel::sizeHint(); 
     qDebug() << "sizeHint(): " << text() << ": " << s; 
     return s; 
    } 

    QSize TestLabel::minimumSizeHint() const 
    { 
     QSize s = QLabel::sizeHint(); 
     qDebug() << "minimumSizeHint(): " << text() << ": " << s; 
     return s; 
    } 
+0

'sizeHint()' является индикатором системы компоновки относительно того, сколько пространства виджет хотел бы использовать, если бы у него было все пространство в мире. Независимо от того, включен ли перенос слов, это просто изменяет поведение 'QLabel', когда он не получает размер, на который он« запрашивал »макет. – Chris

ответ

0

После того, как у меня были проблемы с подсказками размера QLabel - это не был обновлен после того, как текст QLabel был изменен, и мне нужно было сразу после того, как текст (получение ширины текста с использованием метрик шрифта не дает пиксельного точного размера будущей метки). Мне помог - я вызвал invalidate() и activate() для всех макетов в иерархии макета, содержащих этот ярлык, - от самого внутреннего до самого внешнего (именно в этом порядке). После этого обращение к методу labelHint() возвращало новый и правильный. Я помню, что одной из этих двух функций было достаточно, но я не помню, какой из них. Макеты являются довольно грязной частью в Qt, если вы когда-либо видели их коды.

Смежные вопросы