Рисование текста на картинку динамического размера |
Здравствуйте, гость ( Вход | Регистрация )
Рисование текста на картинку динамического размера |
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). Стало быть тут два варианта:
Предположим мы захотели написать что-то на иконке, скажем погоду за окном. Для этого используем метод 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 |
|
|
Litkevich Yuriy |
1.2.2009, 18:31
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
я думаю тему стоит переименовать, т.к. суть не про системный лоток (tray), а про рисование/сглаживание
|
|
|
SABROG |
1.2.2009, 19:37
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
В общем все сводится к тому, чтобы узнать размер шрифта по максимальной ширине символа.
Пока, кроме тупого перебора всех высот замеряя ширину символа, ничего в голову не приходит. --- В общем сделал по принципу Aspect Ratio. Если количество символов увеличилось вдвое, значит высота шрифта уменьшается вдвое, если втрое, то соответственно высота шрифта уменьшится втрое.
P.S.: главное, чтобы строка не была пустой, а то получим деление на 0 Сообщение отредактировал SABROG - 1.2.2009, 20:22 |
|
|
Litkevich Yuriy |
1.2.2009, 20:42
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А сколько символов максимум может быть, два?
может тогда именно под два и делать все, а то скачущие по рпзмеру символы выглядят плохо. |
|
|
SABROG |
1.2.2009, 20:59
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
3 символа вроде тоже можно разобрать. Вообще при таком методе, естественно, теряется полезный размер, т.к. шрифты, по больше части, не квадратные. И скорее всего можно впихнуть 2 символа такого размера, которым сейчас показываются одиночные. У меня изначально задача другая была - autoscaling. Т.е. нарисовать любой текст в рамках заданного размера таким образом, чтобы он не обрезался painter'ом, а для этого надо либо контент ресайзить, либо QPaintDevice. Сейчас думаю как намутить бегущую строку, чтобы первые символы строки вылезали когда последние еще не спрятались.
|
|
|
Litkevich Yuriy |
1.2.2009, 22:13
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Текстовая версия | Сейчас: 30.1.2025, 4:58 |