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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] QGraphicsView::drawBackground()  (Прочитано 5002 раз)
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() перегружен.
Однако при движени мыши с зажатой кнопкой фон не перерисовывается.
У кого какие мнения по этому поводу?
Спасибо.
« Последнее редактирование: Декабрь 23, 2010, 09:46 от klou » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Декабрь 22, 2010, 16:00 »

В Qt по умолчанию вся отрисовка делается асинхронно, т.е. drawBackground() будет вызван только когда QGraphicsView получит QPaintEvent.
Поэтому аккумулируйте движения мыши и отрисовывайте их в drawBackground().

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

Qt 5.11/4.8.7 (X11/Win)
klou
Гость
« Ответ #2 : Декабрь 23, 2010, 07:56 »

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

Нашёл  Веселый
Код:
viewport()->update();
фон обновляется при движении мыши с зажатой левой кнопкой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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