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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsItem. Вывод текста в несколько линий.  (Прочитано 4232 раз)
kamil
Гость
« : Ноябрь 03, 2015, 21:38 »

Задача: есть некоторая точка, около которой нужно вывести текст. Текст должен быть разделен на несколько линий (QString, места переноса строки \n, например: QString("line one\nline two\n...")).

По вертикали текст должен быть выровнен по точке. По горизонтали должен быть выровнен слева и располагаться немного справа, например:


Как это можно сделать средствами Qt?
Наиболее близкое что можно сделать:
Код:
painter->drawText( rect, Qt::TextWordWrap | Qt::AlignVCenter, string );

Но проблема в rect. Как задать ей ширину и, самое главное, высоту, чтобы выровнялось по вертикали нормально?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Ноябрь 03, 2015, 22:12 »

Можно попробовать QRectF QFontMetricsF::boundingRect(const QString & text) const
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Ноябрь 03, 2015, 23:54 »

Отцентрировать рект относительно точки и задать ему заведемо большие высоту и ширину. Тогда сработает.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kamil
Гость
« Ответ #3 : Ноябрь 04, 2015, 11:56 »

Да, точно, тогда все норм.

Только сразу же возник еще один вопрос - с можно ли узнать еще до отрисовки, какая ширина-высота будет у текста? Там просто надо будет еще на фоне текста отрисовать полупрозрачный прямоугольник по размеру теста:

Сейчас размер занимаемого текста можно узнать только после её отрисовки из последнего параметра функции:
Код:
painter->drawText( QRectF(10, -500, 1000, 1000), Qt::TextWordWrap | Qt::AlignVCenter, label, &labelRect );
И полупрозрачный прямоугольник рендерится поверх текста. А надо бы текст поверх прямоугольника:

Можно, конечно, просто еще раз сверху отрисовать текст, но зачем лишний раз отрисовывать, то, что можно отрисовать только раз.

Или можно было бы использовать z-index, но тогда прямоугольник на фоне и текст придется разнести по разным QGraphicsItem, а этого не хотелось бы делать.
Записан
RovingStone
Гость
« Ответ #4 : Декабрь 04, 2015, 11:46 »

Если ещё актуально, можно использовать QFontMetrics, чтобы узнать размеры текста.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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