проблемы с QWidget::setMask |
Здравствуйте, гость ( Вход | Регистрация )
проблемы с QWidget::setMask |
Rocky |
8.4.2010, 22:45
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Всем привет! Помогите пожалуйста разобраться с проблемкой. В программе нужно сделать определенную анимацию. И требуется, чтобы эта анимация как бы пробегала по основной программе (вот как пример это всякие зверушки/девушки/помощники на рабочем столе). У меня бегающий дядя )). Я сделал виджет, в котором переопределил paintEvent. Далее задал этому виджету последовательность картинок *.png (с прозрачностью) и в таймере меняю счетчик кадров картинок (т.к. мужик бежит), затем вызываю метод repaint(). В самом обработчике paintEvent() я вызываю clearMask и затем setMask и после этого рисую новый кадр. В виндовсе вроде как нареканий нет никаких... только разве что медленно отрисовывает (виджет не успевает обрезаться по маске - ну это терпимо)... А в линуксе большие траблы ( При каждой перерисовке у меня мигает черный прямоугольник размером с весь виджет.. и из-за чего он возникает и как его убрать непонятно (. Помогите советом, как можно решить проблему? Может забабахать все картинки в какой-нить gif? Но как его отображать с учетом прозрачности тогда? маска ведь своя для каждого кадра... Или есть еще какие-нить анимированные форматы такие, в которые можно было бы без проблем перегнать png и qt бы их поддерживал?
Спасибо! PS. Вот кусок кода как я делаю.
Сигнал movieFinished соединен со слотом начала анимации (останов таймера у которого слот OnTimer, установка счетчика на 1-й кадр, запуск таймера) |
|
|
igor_bogomolov |
8.4.2010, 22:58
Сообщение
#2
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Может забабахать все картинки в какой-нить gif? Но как его отображать с учетом прозрачности тогда? маска ведь своя для каждого кадра... Я когда то делал такой эксперимент с gif-ом. Там ты найдешь как это делается с использованием гиф-анимации. Но самое печальное, что тот пример работает тоже только под Windows. Что мешает работать под Linux не знаю, не разбирался. Может в выходные попробую ещё по экспериментировать. |
|
|
Rocky |
8.4.2010, 23:13
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Да, я уже читал, пасиб) Щас более внимательно еще раз посмотрю. Жаль что в линуксе не работает... как раз именно он и нужен =(
Тут где-то еще пример был как рисовать поверх всех, так там была тетка танцующая... файл *.mng. Может в эту сторону тоже покопать. Тока что это за формат такой.... Полез в википедию... |
|
|
Rocky |
12.4.2010, 9:19
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Чето вообще непонятно ничего =(
Вот тут шла речь о отрисовке изображения поверх виджетов. В частности была написана такая вот функция для отрисовки кадра анимации mng:
Если скомпилить пример baba, то каждый кадр анимации рисуется на прозрачном фоне. Как так получается? Никаких setMask ничего такого.... Я пишу так:
и нифига.... Все рисуется на каком-то дурацком бело-бежевом квадрате.... Как так? =( Сообщение отредактировал Rocky - 12.4.2010, 9:20 |
|
|
Litkevich Yuriy |
12.4.2010, 9:39
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
может дело в самой картинке? Ты пробовал картинку из "бабы"?
|
|
|
Rocky |
12.4.2010, 9:49
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Пробовал... я уже думаю может дело вот в этой строке
Думаю как бы проверить.... потому что этот виджет на котором все рисуется должен быть поверх главного окна.... и если флаги не ставить, то его не видно вообще ( UPD Неа, не похоже что в ней Сообщение отредактировал Rocky - 12.4.2010, 9:54 |
|
|
Rocky |
12.4.2010, 11:21
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Все как-то очень странно...
1. в paintEvent добавил QPainter::setOpacity(...); 2. this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); заменил на this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); 3. В качестве parentWidget указал класс, производный от QMainFrame (т.е. самый главный), а не 5-й производный от него... И вот так все работает... Нифига не понял в чем фишка.. Но факт на лицо =) ЗЫ. А с gif-ом лучче вообще не заморачиваться. Хотя срок патента на него вроде как истек, но качество у него не супер. Плюсь в qt все-таки он как-то оч непонятно поддерживается. Лучче тогда уж юзать mng - это анимированный png. И качество неплохое, и поддержка есть (тока в линуксе нужно специально компилить еще плагин qmng). Откопал прогу, называется PNG/MNG Construction Set. Оч легкая в освоении. ЗЗЫ. SABROG, спасибо еще раз за ImageMagic - пока ее искал нашел вот этот "PNG/MNG Construction Set". Сообщение отредактировал Rocky - 12.4.2010, 11:21 |
|
|
Текстовая версия | Сейчас: 15.1.2025, 16:54 |