crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Рисование текста на картинку динамического размера
SABROG
  опции профиля:
сообщение 1.2.2009, 18:25
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


В продолжение темы анимации.

Поставить анимированную иконку в трей, в принципе, легко. Тоже самое как и с рисованием на виджете - таймер + QSystemTray::setIcon() в цикле.

Я пошел дальше. Рисую painter'ом на QImage, потом перевожу QImage в QPixmap, а его уже передаю в setIcon. Иначе никак. Проблема возникает, когда тебе в документации прямо говорят, что размеры иконки в винде и иксах - разные. Винда 16x16, иксы - 22x22. Ну да ладно, размеры получаются таким вызовом: tray.geometry().size()

Под эти размеры нужно подогнать некоторое изображение (QImage). Стало быть тут два варианта:
  • рисовать сразу на QImage с размером иконки
  • воспользоваться QImage::scale()


Предположим мы захотели написать что-то на иконке, скажем погоду за окном. Для этого используем метод QPainter::drawText(). И предположим, что мы пользуемся вариантом номер один (QImage того же размера, что и иконка). Тут возникает сразу проблема. Дело в том, что если размер шрифта и/или длинна текста большего размера, чем заданный размер картинки, то все обрежется. Если же мы рисовали изначально на большой картинке, скажем 100x100, а потом присвоили её pixmap иконке, то происходит растягивание (scale). Естественно, что при длинном тексте мы увидим "шрихкод". Более менее нормальное изображение можно получить только при двух символах, скажем счетчик от 0 до 99.
Но даже при том, что стоит
painter.setRenderHint(QPainter::Antialiasing); и
image.scaled(tray.geometry().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);

Изображение невооруженным глазом выглядит криво.


Отсюда получается, что оба варианта мне не подходят. Нужен третий. А это, скорее всего, подбор размера шрифта в зависимости от размеров иконки. Из-за того, что в винде и иксах эти размеры разные, то я не могу тупо поставить размер 12. Мне нужен динамический вариант. Например QFont::setPointSizeF. Но тут опять же пишется, что на разных ОС точность будет разная, а следовательно и размеры. Кроме того я не понимаю как узнать нужную мне цифру исходя из размеров иконки, с учетом того, что ширина шрифта должна быть в 2 раза меньшей так, чтобы в иконке помещалось 2 цифры.

Сообщение отредактировал SABROG - 1.2.2009, 18:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 11:47