Как рисовать на QImage с прозрачностью? |
Здравствуйте, гость ( Вход | Регистрация )
Как рисовать на QImage с прозрачностью? |
Rocky |
4.2.2010, 19:43
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Всем привет!
вот тут http://www.forum.crossplatform.ru/index.php?showtopic=4154 Litkevich Yuriy выложил пример AeroButton. В программе сделал кнопки примерно также. Но чтука в том что под виндой эти кнопки получаются с идеально на мой взгляд ровными обводами засчет антиалайзинга.. А вот под линуксом они ужасны. Вычитал, что в иксах нужно для достижения такого же результат включить какую-то опцию отрисовки. Но есть универсальный способ: рисование на QImage (т.е. как бы использование его движка, а не "движка" ОС). Вот делаю как в книге написано =)
Кнопки рисуются, причем прозрачные... но вот по краям виден белый прямоугольный фон. Вот пример: Как это можно победить? Пробовал играться с QPainter::CompositionMode, максимально только к этому беломы фону прозрачность добавляется....но сам он не исчезает естественно... Спасибо! |
|
|
Litkevich Yuriy |
4.2.2010, 21:15
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Rocky, а ты про painter.setOpacity не забыл?
|
|
|
Rocky |
4.2.2010, 21:28
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
неа (( в том-то и дело что не забыл
|
|
|
Litkevich Yuriy |
4.2.2010, 21:30
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Rocky, ты можешь выложить код AeroButton модифицированный под QImage?
|
|
|
Rocky |
4.2.2010, 21:39
Сообщение
#5
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Вот:
Раскрывающийся текст
|
|
|
Litkevich Yuriy |
4.2.2010, 23:02
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Rocky, сделал попроще чем у тебя и всё работает (Проверял на виндовозе). Проверь
AeroButton2.zip ( 4,44 килобайт ) Кол-во скачиваний: 452 П.С. на окно добавил переключатель, чтобы рисовать напрямую или через QImage |
|
|
Rocky |
4.2.2010, 23:57
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Странно.. но действительно работает.. ))
дело было в fill(...) =) Сообщение отредактировал Rocky - 5.2.2010, 0:06 |
|
|
Litkevich Yuriy |
5.2.2010, 0:22
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Rocky, отпишись, на Линухе использование QImage даёт лучшее сглаживание или нет.
Ну и если будешь продолжать использовать QImage, то лучше рисовать на QImage в отдельном методе, который вызывается в конструкторе и в методах установки свойств. А в обработчике события рисования только выводить уже готовый QImage (QPainter::drawImage()). Так будет быстрее отрисовка происходить |
|
|
Rocky |
5.2.2010, 0:50
Сообщение
#9
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Да, насчет отрисовки завтра переделаю... Весь день буду оптимизацией заниматься... Хотя стоп... Litkevich Yuriy можно задам вопрос, который давно меня мучает... Вроде как он касается этого. Если в конструкторе класса формировать пусть тот же QImage, то как? В смысле если мы находимся внутри самого конструктора класса, то его объект еще не создан. И тем более не отображен на экране. Как тогда получить правильные размеры всех виджетов и пр? Я щас так делаю: просто в main-е после того, как вызвал exec(...) или show(...) главного окна, вызываю некий метод Initialize(...) который по сути далее вызывается иерархически по вссем потомкам главного виджета (окна).. Но как-то не очень нравится этот способ... Может можно как-то лучше?
Вобщем щас вот так в линуксе выглядит: Завтра на работе сделаю скрин как с этим же кодом в XP. --------------------------------------- Вот так выглядит картинка в винде Сообщение отредактировал Rocky - 5.2.2010, 9:02 |
|
|
Litkevich Yuriy |
5.2.2010, 4:30
Сообщение
#10
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Если в конструкторе класса формировать пусть тот же QImage, то как? В смысле если мы находимся внутри самого конструктора класса, то его объект еще не создан. И тем более не отображен на экране. Как тогда получить правильные размеры всех виджетов и пр? есть разные способы применительно к твоей задаче:1) Поискать по форуму по поводу определения размеров в конструкторе (точно помню обсуждалось) 2) Отлавливать resizeEvent и корректировать QImage 3) Сделать как в файле примера %QTDIR%\examples\painting\svgviewer\svgview.cpp класс SvgRasterView 4) переопределить метод show(), в котором вызывать метод базового класса (после него станут известны размеры), а затем корректировать QImage |
|
|
Текстовая версия | Сейчас: 1.12.2024, 13:05 |