2015-07-27 4 views
0

Я хотел использовать openGL для рендеринга QGraphicsview элементов, чтобы я мог сохранить мощность процессора. В документации указано, что мне нужно добавить QOpenGLWidget в качестве порта просмотра QGraphicsview. Это то, что я делаю:Использование QOpenGLWidget с QGraphicsView: просмотр не обновляется?

QOpenGLWidget *glWidget = new QOpenGLWidget(); 
ui->drawScreen->setViewport(glWidget); 
ui->drawScreen->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); 
ui->drawScreen->update(); 

(ui->drawScreen это мой QgraphicsView)

Когда я рисую что-то на экране он правильно рисует, но после некоторого времени я хочу, чтобы удалить элемент с выцветанию анимации , Это не раздражая экран для обновления, то есть, когда я делаю это:

double opacity = 1.0 - ((elapsed - annotationFrameOut)/(double)fadeOutFrames); 
(*i)->setOpacity(opacity); 

(*i) один пункт.

Или это:

scene.removeItem(item); 

Визуально ничего не происходит. Только когда я изменяю размер экрана, элемент исчезает или показывает правильную непрозрачность в случае, если он исчезает.

Кроме того, когда я перемещаю элемент, никакая позиция не исчезает, поэтому он создает эффект перетаскивания. То же самое для прямоугольника выделения или при вводе текстового элемента (ограничивающий прямоугольник рисуется несколько раз).

Это похоже на простую проблему с обновлением, но я не могу понять, что делать, и мне не кажется, что эта проблема возникает в Интернете. Я использую Windows.

Спасибо за ваше время.

EDIT: Рисунок, иллюстрирующий проблему. Синие прямоугольники прямоугольники выбора, которые никогда не удаляются (если я не изменить размер окна) Blue rectangles are the selection rectangle that is never removed (unless I re-size the window)

EDIT 2: код с помощью QGLWidget

QGLWidget *viewPort = new QGLWidget(QGLFormat(QGL::SampleBuffers | QGL::AlphaChannel), ui->drawScreen); 

ui->drawScreen->setViewport(viewPort); 
ui->drawScreen->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); 
ui->drawScreen->update(); 

EDIT 3: В моем приложении у меня есть видео играя ниже QGraphicsView. Я показываю видео, обновляя QLabel каждый раз, когда появляется новый фрейм.

Вместо использования QLabel Я попытался обновить QPixmapQGraphicsPixmapImage. Если теперь я рисую поверх этого изображения, рисунок правильно обновляется, я думаю, потому что изображение постоянно обновляется. Но за пределами картинки он все равно не работает.

+0

Похоже, вы не обновляете свое окно. Вы пытались вызвать функцию «update()»? Это функция, которая является частью QOpenGLWidget, унаследованной от QWidget. Вызовите функцию в paintGL() или везде, где вы обновляете основной цикл вашей программы. – Poriferous

+0

Я расширил класс 'QGraphicsView'. Внутри него у меня есть метод, который проверяет, когда нарисованные элементы должны быть удалены (на основе кадров из видео). Там я попытался сделать 'viewport() -> update()' или вызвать 'update()' view, но он не работает. Без 'openGL' это работает хорошо (даже без этого вызова). Должен ли я расширять 'QOpenGLWidget' и реализовывать собственную' paintGL'? Похоже, что не только мои операции, но и все, что означает удаление рисованного элемента, не обновляются (например, прямоугольник выделения). – Solidus

+0

Я добавил картинку, чтобы проиллюстрировать это. – Solidus

ответ

1

Кажется, проблема кроется с stylesheet Я использовал для изменения цвета фона вида. Добавление stylesheet к widget также вызывает такую ​​же ошибку. С stylesheet порт просмотра просто становится черным, и обновление элементов не работает должным образом.

Я удалил stylesheet и изменил фоновый цвет путем повторной реализации функции drawBackground.

Спасибо Kuba Ober за помощь в выяснении этого.

1

Явный звонок update() не требуется. Это похоже на ошибку Qt. QGraphicsViewdoes some magic - QGLWidget, чтобы он работал как окно просмотра. Скорее всего, эта магия не была портирована для работы с QOpenGLWidget.

В качестве обходного пути используйте вместо этого QGLWidget.

+0

Я попытался использовать 'QGLWidget' и получил те же результаты. Я использую QT5.5, может быть, это проблема с этой версией? – Solidus

+0

@Solidus Попробуйте с предыдущими версиями. –

+0

Что-то интересное. В качестве простого примера я создал другой проект. Я просто создал «QGraphicsView», «QGraphicsScene» и добавил одну кнопку, чтобы добавить текстовый элемент и одну кнопку, чтобы удалить его. Я сделал вид viewport 'QGLWidget', и он работает хорошо. Может ли это быть связано с тем, что мой взгляд является унаследованным классом? Кроме того, в моем проекте, когда я использую 'openGL', фон становится черным. В этом маленьком примере он остается белым. EDIT: черный фон - это потому, что у меня был прозрачный вид. Это все еще хорошо работает с этим в моем примере, хотя это не проблема. – Solidus

0

В некотором роде таблица стилей генерирует ошибку перерисовки, даже в моем случае я удалил таблицу стилей, и все работает правильно.

Смежные вопросы