Russian Qt Forum

Qt => Вопросы новичков => Тема начата: PavelVX от Ноябрь 21, 2011, 09:53



Название: QLabel - как получить размер height после изменения текста?
Отправлено: PavelVX от Ноябрь 21, 2011, 09:53
Вопрос возник вот из-за чего: пишу систему печати: http://www.prog.org.ru/topic_19872_0.html. Понадобилось узнать, сколько строчек будет занимать текст, что бы правильно формировать разбивку постранично. Длинну текста посимвольно узнать не проблема, а вот размер физического места проблема. Решил сделать такой трюк:
QLabel * labelTst = new QLabel(this);
labelTst->setWordWrap(true);
labelTst->setFixedWidth(100);
Вставляем текст и вуаля, физический размер. Но возникла странная проблема:
    qDebug() << QString("before %1 - %2").arg(editTst->text()).arg(labelTst->height());
    labelTst->setText(editTst->text());
    labelTst->update();
    labelTst->updateGeometry();
    qDebug() << QString("after %1 - %2").arg(editTst->text()).arg(labelTst->height());
Показывает одинаковый размер! А при перевызове этой функции, покажет правильный размер для старого текста. Т.е., если я правильно понимаю, то виджет не успел перерисоваться, а я уже спрашиваю новый размер виджета. Как это побороть? Или есть более элегантное решение проблемы получания физического размера текста?


Название: Re: QLabel - как получить размер height после изменения текста?
Отправлено: iroln от Ноябрь 21, 2011, 12:08
Можно повесить на QLabel фильтр событий и ловить событие QEvent::Resize. После того, как это событие приходит, должен быть получен уже изменённый размер виджета. Либо можно наследоваться от QLabel и переопределить метод resizeEvent. Первый вариант просто позволяет избежать наследования.

Или я что-то не так понимаю и тут совсем другая проблема?


Название: Re: QLabel - как получить размер height после изменения текста?
Отправлено: Kolobok от Ноябрь 21, 2011, 12:15
QTextDocument


Название: Re: QLabel - как получить размер height после изменения текста?
Отправлено: PavelVX от Ноябрь 21, 2011, 12:56
А QTextDocument-то как сюда прикрутить?
С QLabel QEvent::Resize как-то геморойно связываться :(.
Получается так:
1. получаем строку из рекордсета
2. Отправляем её в QLabel
3. ждем непонятно чего
4. В фильтре получаем инфу о ресайзе QLabel
5. В печати делаем нужный отступ
6. Запрашиваем новую строку в рекордсете.
Как-то громоздко :(.


Название: Re: QLabel - как получить размер height после изменения текста?
Отправлено: marbius от Ноябрь 21, 2011, 14:06
Здравствуйте.

Не совсем уверен в решении (не на чем сейчас проверить), но попробуйте вставить Ваш QLabel в QVBoxLayout, а после смены текста вызвать QLabel::adjustSize()

А вообще как пишет Kolobok, наверное, как-то так правильнее:
Код
C++ (Qt)
QTextDocument *doc=new QTextDocument();
doc->setPlainText(your_text);
doc->setPageSize(QSizeF(your_width,-1));
qDebug() << doc->size();


Название: Re: QLabel - как получить размер height после изменения текста?
Отправлено: PavelVX от Ноябрь 22, 2011, 07:08
Тогда извиняюсь за ламерский вопрос: а в чем измеряется QSizeF? В пикселях?
QSizeF(100, 21) - это при пустой строке или одно слово в QLabel
QSizeF(100, 34) - две строки в QLabel
QSizeF(100, 47) - три строки в QLabel
QSizeF(100, 60) - четыре строки в QLabel
Разница в 13 единиц, почему тогда стартовя 21, а не 13? Запасы на отступы до и после текста?