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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Плохая перерисовска полупрозрачного виджета  (Прочитано 3739 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Январь 23, 2010, 22:46 »

Есть виджет, служащий фоном, на котором в бесконечном цикле прокручивается картинка. Поверх этого виджета располагается другой полупрозрачный виджет (назовем его маркер), сквозь который видно, как эта фоновая картинка крутится. Этот маркер можно двигать с помощью мышки и клавиатуры. Так вот, при перемещении маркера он отрисовывает сначала кусок фона с предыдущего места, и только через некоторое время вновь становится полупрозрачным. Как бы от этого эффекта избавиться?
P.S. Qt 4.6.1, MSVC, WinXP SP3
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Январь 23, 2010, 22:49 »

код не смотрел, может дело в том, что при перемещении перерисовка происходит с некой задержкой?
Т.е. вызывается update(), который может накапливать события, вместо их немедленной обработки.
Или, учитывая наличие бесконечного цикла работы с картинкой, на событие перерисовки отводится не достаточно времени, т.е. они выполняются редко.
Записан

Юра.
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Январь 23, 2010, 23:00 »

Остановил скроллинг. Стало еще интереснее - при перемещении маркера фон просто трется и не перерисывывается, а под маркером остается тот кусок фона, который был при создании маркера.
Фоновый виджет отрисовывается следующим образом:
Код:
void Waterfall::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, false);
    if (!_rendered) renderImage();
    painter.drawImage(event->rect().topLeft(), _dstImg);
}
Маркер так:
Код:
void SpecMarker::paintEvent(QPaintEvent * /*event*/)
{
    QStyleOption opt;
    opt.initFrom(this);
    QPainter painter(this);
    painter.fillRect(rect(), opt.palette.background());
}
Плюс у маркера есть
Код:
    setStyleSheet("background-color: rgba(85, 192, 0, 64);");
Записан
BRE
Гость
« Ответ #3 : Январь 23, 2010, 23:05 »

Код
C++ (Qt)
void Waterfall::paintEvent(QPaintEvent *event)
{
   QPainter painter(this);
   painter.setRenderHint(QPainter::Antialiasing, false);
   if (!_rendered) renderImage();
   painter.drawImage( /*event->rect().topLeft()*/QPoint( 0, 0 ), _dstImg);
}
 
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Январь 23, 2010, 23:34 »

Спасибо. Заработало - скопировал кусок кода с другого варианта реализации и замыленный глаз этого куска упорно не замечал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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