Russian Qt Forum
Ноябрь 24, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLabel - как получить размер height после изменения текста?  (Прочитано 4052 раз)
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());
Показывает одинаковый размер! А при перевызове этой функции, покажет правильный размер для старого текста. Т.е., если я правильно понимаю, то виджет не успел перерисоваться, а я уже спрашиваю новый размер виджета. Как это побороть? Или есть более элегантное решение проблемы получания физического размера текста?
Записан
iroln
Гость
« Ответ #1 : Ноябрь 21, 2011, 12:08 »

Можно повесить на QLabel фильтр событий и ловить событие QEvent::Resize. После того, как это событие приходит, должен быть получен уже изменённый размер виджета. Либо можно наследоваться от QLabel и переопределить метод resizeEvent. Первый вариант просто позволяет избежать наследования.

Или я что-то не так понимаю и тут совсем другая проблема?
« Последнее редактирование: Ноябрь 21, 2011, 12:10 от iroln » Записан
Kolobok
Гость
« Ответ #2 : Ноябрь 21, 2011, 12:15 »

QTextDocument
Записан
PavelVX
Гость
« Ответ #3 : Ноябрь 21, 2011, 12:56 »

А QTextDocument-то как сюда прикрутить?
С QLabel QEvent::Resize как-то геморойно связываться Грустный.
Получается так:
1. получаем строку из рекордсета
2. Отправляем её в QLabel
3. ждем непонятно чего
4. В фильтре получаем инфу о ресайзе QLabel
5. В печати делаем нужный отступ
6. Запрашиваем новую строку в рекордсете.
Как-то громоздко Грустный.
Записан
marbius
Гость
« Ответ #4 : Ноябрь 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();
« Последнее редактирование: Ноябрь 21, 2011, 14:20 от µarbius » Записан
PavelVX
Гость
« Ответ #5 : Ноябрь 22, 2011, 07:08 »

Тогда извиняюсь за ламерский вопрос: а в чем измеряется QSizeF? В пикселях?
QSizeF(100, 21) - это при пустой строке или одно слово в QLabel
QSizeF(100, 34) - две строки в QLabel
QSizeF(100, 47) - три строки в QLabel
QSizeF(100, 60) - четыре строки в QLabel
Разница в 13 единиц, почему тогда стартовя 21, а не 13? Запасы на отступы до и после текста?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 21.