Я хотел использовать 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: Рисунок, иллюстрирующий проблему. Синие прямоугольники прямоугольники выбора, которые никогда не удаляются (если я не изменить размер окна)
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
Я попытался обновить QPixmap
QGraphicsPixmapImage
. Если теперь я рисую поверх этого изображения, рисунок правильно обновляется, я думаю, потому что изображение постоянно обновляется. Но за пределами картинки он все равно не работает.
Похоже, вы не обновляете свое окно. Вы пытались вызвать функцию «update()»? Это функция, которая является частью QOpenGLWidget, унаследованной от QWidget. Вызовите функцию в paintGL() или везде, где вы обновляете основной цикл вашей программы. – Poriferous
Я расширил класс 'QGraphicsView'. Внутри него у меня есть метод, который проверяет, когда нарисованные элементы должны быть удалены (на основе кадров из видео). Там я попытался сделать 'viewport() -> update()' или вызвать 'update()' view, но он не работает. Без 'openGL' это работает хорошо (даже без этого вызова). Должен ли я расширять 'QOpenGLWidget' и реализовывать собственную' paintGL'? Похоже, что не только мои операции, но и все, что означает удаление рисованного элемента, не обновляются (например, прямоугольник выделения). – Solidus
Я добавил картинку, чтобы проиллюстрировать это. – Solidus