Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: andrew.k от Март 19, 2012, 13:23



Название: [Решено] Текст по кругу, QPainter
Отправлено: andrew.k от Март 19, 2012, 13:23
Как нарисовать текст по кругу?
Задача - рисовать этикетку для диска. Текст должен быть по кругу.


Название: Re: Текст по кругу
Отправлено: kibsoft от Март 19, 2012, 13:30
http://qt-project.org/faq/answer/how_do_i_make_text_follow_the_line_curve_and_angle_of_the_qpainterpath


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 19, 2012, 13:39
http://qt-project.org/faq/answer/how_do_i_make_text_follow_the_line_curve_and_angle_of_the_qpainterpath
Это я видел. Неужели нет проще решения?


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 20, 2012, 10:26
Код по ссылке (с небольшими изменениями, сделал путь по кругу) дает такой результат.
Буквы скачут как попало.


Название: Re: Текст по кругу
Отправлено: Bepec от Март 20, 2012, 10:29
Кхм. а как ты хотел? в смысле чтобы их нижняя граница образовывала круг?

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


Название: Re: Текст по кругу
Отправлено: V1KT0P от Март 20, 2012, 10:37
Код по ссылке (с небольшими изменениями, сделал путь по кругу) дает такой результат.
Буквы скачут как попало.
К кругу вроде как привязано нормально, но вот с поворотом букв где-то намудрил. Впечатление такое что либо не с того градуса начал рисовать, либо не с того градуса начал поворачивать буквы. Либо надо было по часовой а ты против часовой начал отрисовывать.


Название: Re: Текст по кругу
Отправлено: V1KT0P от Март 20, 2012, 10:55
update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
Взял я тот алгоритм, короче либо он изначально был неправильный либо что-то изменилось в Qt. Ибо он неправильно работает.


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 20, 2012, 10:58
Кхм. а как ты хотел? в смысле чтобы их нижняя граница образовывала круг?

update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
Спасибо, кэп.


Название: Re: Текст по кругу
Отправлено: V1KT0P от Март 20, 2012, 11:35
Кхм. а как ты хотел? в смысле чтобы их нижняя граница образовывала круг?

update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
Спасибо, кэп.
Короче там что-то с углом напутали, вот после этой строки:
Код
C++ (Qt)
qreal angle = path.angleAtPercent(percent);
Добавь эти строчки:
Код
C++ (Qt)
if (angle >0)
   angle = 360 - angle;
else
   angle = fabs(angle);
У меня заработало нормально.


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 20, 2012, 12:01
Виктор, спасибо огромное.
Получилось то, что надо. Правда не очень стройно. Кажется даже, что у тебя стройнее буквы идут)

Остался один деффект. В нижней части круга, буквы идут выше линии.
Но это не так уже важно, в общем


Название: Re: Текст по кругу
Отправлено: V1KT0P от Март 20, 2012, 12:19
Виктор, спасибо огромное.
Получилось то, что надо. Правда не очень стройно. Кажется даже, что у тебя стройнее буквы идут)

Остался один деффект. В нижней части круга, буквы идут выше линии.
Но это не так уже важно, в общем
Не очень стройно по одной причине, ибо буква рисуется так, что точка находится в левом нижнем углу. А чтоб было ровно надо чтоб точка было посредине буквы, вот пример как можно пофиксить:
Код
C++ (Qt)
QFontMetrics fm = painter.fontMetrics();
QPointF center = QPointF( point.x() - (fm.width(hw[i])/2), point.y());
painter.drawText(center,QString(hw[i]));

А про то что нижние выше линии я даже не знаю почему. Скорее всего это что-то в функции отрисовки, ибо точка четко на линии.


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 20, 2012, 12:50
А про то что нижние выше линии я даже не знаю почему. Скорее всего это что-то в функции отрисовки, ибо точка четко на линии.
Я понял почему, это результат моих мытарств. Починил.


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 20, 2012, 12:58
Теперь новая проблема, почему скачет жирность букв.
Добавляю такую строчку tran.rotate(rad,Qt::XAxis); жирность выравнивается, но буквы внизу уходят чуть выше.
Убираю. Четко по кругу, но жирность скачет абы как.


Название: Re: Текст по кругу
Отправлено: V1KT0P от Март 20, 2012, 13:36
Теперь новая проблема, почему скачет жирность букв.
Добавляю такую строчку tran.rotate(rad,Qt::XAxis); жирность выравнивается, но буквы внизу уходят чуть выше.
Убираю. Четко по кругу, но жирность скачет абы как.
Многое по рендеру текста зависит от самого шрифта. У меня извечная проблема подобрать и настроить шрифты под линуксом. Либо попробуй использовать другой шрифт. Либо рисуй в большем размере а затем уменьшай до нужного, только используй нормальные алгоритмы. Мне например нравится Lanczos3, но если ты будешь использовать увеличение кратное двойке, то пойдут и более простые и быстрые алгоритмы.


Название: Re: Текст по кругу
Отправлено: andrew.k от Март 20, 2012, 13:49
Виктор, огромное спасибо за помощь.