Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: klou от Декабрь 22, 2010, 14:05



Название: [решено] QGraphicsView::drawBackground()
Отправлено: klou от Декабрь 22, 2010, 14:05
Есть пользовательски класс, унаследованный от QGraphicsView.
В конструкторе есть строка:
Код:
setCacheMode(QGraphicsView::CacheNone);
При движении мыши:
Код:
void QMyGraphicsView::mouseMoveEvent( QMouseEvent *event )
{
switch(event->buttons()) {
case Qt::LeftButton:
{
resetCachedContent ();
QGraphicsView::resetCachedContent();
QGraphicsView::repaint();
QGraphicsView::update();
QMyGraphicsView::repaint();
update();
break;
}
                                 ...
                                 ...
default: break;
}
}
QGraphicsView::drawBackground() перегружен.
Однако при движени мыши с зажатой кнопкой фон не перерисовывается.
У кого какие мнения по этому поводу?
Спасибо.


Название: Re: QGraphicsView::drawBackground()
Отправлено: GreatSnake от Декабрь 22, 2010, 16:00
В Qt по умолчанию вся отрисовка делается асинхронно, т.е. drawBackground() будет вызван только когда QGraphicsView получит QPaintEvent.
Поэтому аккумулируйте движения мыши и отрисовывайте их в drawBackground().

PS. логичнее использовать drawForeground(), хотя это зависит от задачи.


Название: Re: QGraphicsView::drawBackground()
Отправлено: klou от Декабрь 23, 2010, 07:56
Задача следующая:
Необходимо активно(часто) перерисовывать изменяющийся фон (который рисуется с использованием OpenGL) при условии, что сверху фона отображаются различные QGraphicsItem.
Как один из вариантов была идея обернуть QGraphicsItem, переопределить событие Paint (отрисовка фона), при создании назначить "Z-координату" (setZValue() ) таким образом, чтобы Item оказался ниже всех других.
Однако в проекте используются дисплейные списки и так получается, что они создаются в другом контектсте воспроизведения.
Т.о. код вида
Код:
glBegin(GL_TRIANGLES);
...
glEnd();
работает нормально, а
Код:
glCallLists(...);
работает ... уже не так как нужно  :)


Название: Re: QGraphicsView::drawBackground()
Отправлено: klou от Декабрь 23, 2010, 09:43
Нашёл  :D
Код:
viewport()->update();
фон обновляется при движении мыши с зажатой левой кнопкой