Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Torvald от Сентябрь 24, 2017, 06:56



Название: [Решено] QPainter: обводка текста с выравниванием
Отправлено: Torvald от Сентябрь 24, 2017, 06:56
Вопрос: как на QImage нарисовать текст с окантовкой (outline) и при этом чтобы работало выравнивание (по левому/правому краю) нескольких строк?
Пробую через QPainterPath но там только метод addText, который не учитывает ни направление письма ни мультистроку ни межстрочный интервал и тд.

Текст рисую так:
p.drawText(rect, flag, currPreset.text);
где p - QPainter
rect - в этот рект вписывается текст
flag - флаги текста (Qt::AlignRight, Qt::TextWordWrap)


Название: Re: QPainter: обводка текста с выравниванием
Отправлено: Apktyc от Сентябрь 25, 2017, 10:42
Если костыль@велосипедь допустимо, то через QTextDocument однопиксельную обводку можно сделать так.

Код
C++ (Qt)
 QPainter* Painter = new QPainter;
 TextImage.fill(BackgroundColor);
 Painter->begin(&TextImage);
 // Outline text
 if (OutlineColor != Qt::transparent)
 {
   Painter->translate(-1, 0);
   TextDocument->drawContents(Painter);
   Painter->translate(2, 0);
   TextDocument->drawContents(Painter);
   Painter->translate(-1, 1);
   TextDocument->drawContents(Painter);
   Painter->translate(0, -2);
   TextDocument->drawContents(Painter);
   Painter->translate(0, 1);
   Painter->setCompositionMode(QPainter::CompositionMode_SourceIn);
   Painter->fillRect(TextImage.rect(), OutlineColor);
   Painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
 }
 TextDocument->drawContents(Painter);
 Painter->end();


Название: Re: QPainter: обводка текста с выравниванием
Отправлено: Torvald от Сентябрь 26, 2017, 00:04
Уже сделал. Немного хардкорным методом правда. Рендерю текст в отдельный буфер, строю SDF, делаю обводку, вывожу.