Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kamil от Ноябрь 03, 2015, 21:38



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

По вертикали текст должен быть выровнен по точке. По горизонтали должен быть выровнен слева и располагаться немного справа, например:
(http://zaripov.net/Untitled-1.png)

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

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


Название: Re: QGraphicsItem. Вывод текста в несколько линий.
Отправлено: PimenS от Ноябрь 03, 2015, 22:12
Можно попробовать QRectF QFontMetricsF::boundingRect(const QString & text) const


Название: Re: QGraphicsItem. Вывод текста в несколько линий.
Отправлено: Racheengel от Ноябрь 03, 2015, 23:54
Отцентрировать рект относительно точки и задать ему заведемо большие высоту и ширину. Тогда сработает.


Название: Re: QGraphicsItem. Вывод текста в несколько линий.
Отправлено: kamil от Ноябрь 04, 2015, 11:56
Да, точно, тогда все норм.

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

Или можно было бы использовать z-index, но тогда прямоугольник на фоне и текст придется разнести по разным QGraphicsItem, а этого не хотелось бы делать.


Название: Re: QGraphicsItem. Вывод текста в несколько линий.
Отправлено: RovingStone от Декабрь 04, 2015, 11:46
Если ещё актуально, можно использовать QFontMetrics, чтобы узнать размеры текста.