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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Текст по кругу, QPainter  (Прочитано 8670 раз)
andrew.k
Гость
« : Март 19, 2012, 13:23 »

Как нарисовать текст по кругу?
Задача - рисовать этикетку для диска. Текст должен быть по кругу.
« Последнее редактирование: Март 20, 2012, 13:50 от andrew.k » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Март 19, 2012, 13:30 »

http://qt-project.org/faq/answer/how_do_i_make_text_follow_the_line_curve_and_angle_of_the_qpainterpath
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
andrew.k
Гость
« Ответ #2 : Март 19, 2012, 13:39 »

Это я видел. Неужели нет проще решения?
Записан
andrew.k
Гость
« Ответ #3 : Март 20, 2012, 10:26 »

Код по ссылке (с небольшими изменениями, сделал путь по кругу) дает такой результат.
Буквы скачут как попало.
Записан
Bepec
Гость
« Ответ #4 : Март 20, 2012, 10:29 »

Кхм. а как ты хотел? в смысле чтобы их нижняя граница образовывала круг?

update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
« Последнее редактирование: Март 20, 2012, 10:42 от Bepec » Записан
V1KT0P
Гость
« Ответ #5 : Март 20, 2012, 10:37 »

Код по ссылке (с небольшими изменениями, сделал путь по кругу) дает такой результат.
Буквы скачут как попало.
К кругу вроде как привязано нормально, но вот с поворотом букв где-то намудрил. Впечатление такое что либо не с того градуса начал рисовать, либо не с того градуса начал поворачивать буквы. Либо надо было по часовой а ты против часовой начал отрисовывать.
Записан
V1KT0P
Гость
« Ответ #6 : Март 20, 2012, 10:55 »

update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
Взял я тот алгоритм, короче либо он изначально был неправильный либо что-то изменилось в Qt. Ибо он неправильно работает.
Записан
andrew.k
Гость
« Ответ #7 : Март 20, 2012, 10:58 »

Кхм. а как ты хотел? в смысле чтобы их нижняя граница образовывала круг?

update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
Спасибо, кэп.
Записан
V1KT0P
Гость
« Ответ #8 : Март 20, 2012, 11:35 »

Кхм. а как ты хотел? в смысле чтобы их нижняя граница образовывала круг?

update: мб мне только кажется, но помоему у тебя просто угол поворота не в ту сторону направлен... Проще говоря они у тебя влево заваливаются, а должны вправо.
Спасибо, кэп.
Короче там что-то с углом напутали, вот после этой строки:
Код
C++ (Qt)
qreal angle = path.angleAtPercent(percent);
Добавь эти строчки:
Код
C++ (Qt)
if (angle >0)
   angle = 360 - angle;
else
   angle = fabs(angle);
У меня заработало нормально.
Записан
andrew.k
Гость
« Ответ #9 : Март 20, 2012, 12:01 »

Виктор, спасибо огромное.
Получилось то, что надо. Правда не очень стройно. Кажется даже, что у тебя стройнее буквы идут)

Остался один деффект. В нижней части круга, буквы идут выше линии.
Но это не так уже важно, в общем
Записан
V1KT0P
Гость
« Ответ #10 : Март 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]));

А про то что нижние выше линии я даже не знаю почему. Скорее всего это что-то в функции отрисовки, ибо точка четко на линии.
Записан
andrew.k
Гость
« Ответ #11 : Март 20, 2012, 12:50 »

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

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

Теперь новая проблема, почему скачет жирность букв.
Добавляю такую строчку tran.rotate(rad,Qt::XAxis); жирность выравнивается, но буквы внизу уходят чуть выше.
Убираю. Четко по кругу, но жирность скачет абы как.
Многое по рендеру текста зависит от самого шрифта. У меня извечная проблема подобрать и настроить шрифты под линуксом. Либо попробуй использовать другой шрифт. Либо рисуй в большем размере а затем уменьшай до нужного, только используй нормальные алгоритмы. Мне например нравится Lanczos3, но если ты будешь использовать увеличение кратное двойке, то пойдут и более простые и быстрые алгоритмы.
Записан
andrew.k
Гость
« Ответ #14 : Март 20, 2012, 13:49 »

Виктор, огромное спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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