Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: MadKriS от Март 21, 2010, 00:41



Название: [РЕШЕНО] Вывести текст вдоль кривой
Отправлено: MadKriS от Март 21, 2010, 00:41
Доброго времени суток всем!
Подскажите, как вывести текст вдоль кривой (как в Фотошопе)?
Мне самому на ум приходит выводить каждую букву текста с координатами и углом поворота в зависимости от оных у кривой в каждом конкретном участке, только как координаты с углом "понять", не знаю...
Или есть какое-то более изящное решение ?


Название: Re: Вывести текст вдоль кривой
Отправлено: lit-uriy от Март 21, 2010, 01:02
я думаю, тут поможет QPainterPath

Ещё глянь Wiggly Example (%QTDIR%/examples/widgets/wiggly)


Название: Re: Вывести текст вдоль кривой
Отправлено: Marat(Qt) от Март 21, 2010, 12:12
А как на счет svg? В inkscape очень неплохо это получается.


Название: Re: Вывести текст вдоль кривой
Отправлено: ieroglif от Март 21, 2010, 15:47
я бы (если бы не сильно ленивым был) всё же для каждой буквы высчитывал угол.
ширина буквы известна, а значит известно на каком участке графика эта буква будет расположена.
так что для каждой буквы имеем следующее:
1. координата начала буквы
2. координата конца буквы
из этого получаем уравнение прямой по которой надо рисовать букву, а значит вычисляем и угол на который эта линия "наклонена" (а значит и буква).
так что пишем две небольшие функции (одна для разбора "фразы" по буквам, а вторая - для рисования буквы) и всё.

но так как я ленив и уже прочитал ответ про QPainterPath - то сначала бы я про него покурил ман, а уж если там ничего бы не наковырялось, то писал бы функции =)


Название: Re: Вывести текст вдоль кривой
Отправлено: MadKriS от Апрель 02, 2010, 15:22
"Нарезать" кривую на равные кусочки получилось.
Насчёт поворотов букв вопрос пока что остаётся открытым.


Название: Re: [РЕШЕНО] Вывести текст вдоль кривой
Отправлено: MadKriS от Май 01, 2010, 23:57
Всё, сделал сам.

Использовал функцию QPainterPath'a - angleAtPercent, вычисляющую угол перпендикуляра к касательной в точке пути.

UPD
точнее так
Код:
angle = textpath.angelAtPercent(one_part*i);
QTransform transform;
transform.translate(point.x(), point.y());
transform.rotate(angle);
transform.translate(-point.x(), -point.y());
painter.setWorldTransform(transform);