Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: xokc от Январь 23, 2010, 22:46



Название: Плохая перерисовска полупрозрачного виджета
Отправлено: xokc от Январь 23, 2010, 22:46
Есть виджет, служащий фоном, на котором в бесконечном цикле прокручивается картинка. Поверх этого виджета располагается другой полупрозрачный виджет (назовем его маркер), сквозь который видно, как эта фоновая картинка крутится. Этот маркер можно двигать с помощью мышки и клавиатуры. Так вот, при перемещении маркера он отрисовывает сначала кусок фона с предыдущего места, и только через некоторое время вновь становится полупрозрачным. Как бы от этого эффекта избавиться?
P.S. Qt 4.6.1, MSVC, WinXP SP3


Название: Re: Плохая перерисовска полупрозрачного виджета
Отправлено: lit-uriy от Январь 23, 2010, 22:49
код не смотрел, может дело в том, что при перемещении перерисовка происходит с некой задержкой?
Т.е. вызывается update(), который может накапливать события, вместо их немедленной обработки.
Или, учитывая наличие бесконечного цикла работы с картинкой, на событие перерисовки отводится не достаточно времени, т.е. они выполняются редко.


Название: Re: Плохая перерисовска полупрозрачного виджета
Отправлено: xokc от Январь 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);");


Название: Re: Плохая перерисовска полупрозрачного виджета
Отправлено: BRE от Январь 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);
}
 


Название: Re: Плохая перерисовска полупрозрачного виджета
Отправлено: xokc от Январь 23, 2010, 23:34
Спасибо. Заработало - скопировал кусок кода с другого варианта реализации и замыленный глаз этого куска упорно не замечал.