Spec-Zone.ru › Qt

Класс QOpenGLWindow

Класс QOpenGLWindow — это удобный подкласс QWindow для выполнения отрисовки OpenGL. Подробнее...

Заголовок: #include <QOpenGLWindow>
CMake: find_package(Qt6 COMPONENTS OpenGL REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
С версии: Qt 5.4
Наследует: QPaintDeviceWindow
  • Список всех членов, включая унаследованные

Типы публичного доступа

Перечисление UpdateBehavior { NoPartialUpdate, PartialUpdateBlit, PartialUpdateBlend }

Функции публичного доступа

QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
виртуальный ~QOpenGLWindow()
QOpenGLContext * context() const
GLuint defaultFramebufferObject() const
void doneCurrent()
QImage grabFramebuffer()
bool isValid() const
void makeCurrent()
QOpenGLContext * shareContext() const
QOpenGLWindow::UpdateBehavior updateBehavior() const

Сигналы

void frameSwapped()

Защищённые функции

виртуальный void initializeGL()
виртуальный void paintGL()
виртуальный void paintOverGL()
виртуальный void paintUnderGL()
виртуальный void resizeGL(int w, int h)

Переопределённые защищённые функции

виртуальный void paintEvent(QPaintEvent *event) override
виртуальный void resizeEvent(QResizeEvent *event) override

Подробное описание

QOpenGLWindow — это расширенный QWindow, который позволяет легко создавать окна для выполнения рендеринга OpenGL с API, совместимым с QOpenGLWidget. В отличие от QOpenGLWidget, QOpenGLWindow не зависит от модуля виджетов и предлагает лучшую производительность.

Типичное приложение будет наследовать QOpenGLWindow и переопределять следующие виртуальные функции:

  • initializeGL() для инициализации ресурсов OpenGL
  • resizeGL() для настройки матриц преобразования и других ресурсов, зависящих от размера окна
  • paintGL() для выдачи команд OpenGL или отрисовки с помощью QPainter

Для планирования перерисовки вызовите функцию update(). Обратите внимание, что это не приведет к немедленному вызову paintGL(). Вызов update() несколько раз подряд не повлияет на поведение.

Это слот, поэтому его можно подключить к сигналу QTimer::timeout() для выполнения анимации. Однако в современном мире OpenGL гораздо лучше полагаться на синхронизацию с частотой вертикальной развертки дисплея. См. setSwapInterval() для описания интервала обновления. С интервалом обновления 1, который установлен по умолчанию на большинстве систем, вызов swapBuffers(), выполняемый внутри QOpenGLWindow после каждой перерисовки, будет блокироваться и ждать vsync. Это означает, что всякий раз, когда обмен выполняется, можно запланировать обновление повторно, вызвав update(), не полагаясь на таймеры.

Для запроса определенной конфигурации контекста используйте setFormat(), как и для любого другого QWindow. Это позволяет, среди прочего, запросить определенную версию и профиль OpenGL или включить буферы глубины и трафарета.

В отличие от QWindow, QOpenGLWindow позволяет открывать painter для себя и выполнять отрисовку на основе QPainter.

QOpenGLWindow поддерживает несколько стратегий обновления. По умолчанию, NoPartialUpdate эквивалентно обычному окну OpenGL QWindow. В отличие от этого, PartialUpdateBlit и PartialUpdateBlend больше соответствуют способу работы QOpenGLWidget, где всегда существует дополнительный выделенный буфер кадра. Эти режимы позволяют, жертвуя некоторыми производительностью, перерисовывать только меньшую область при каждой перерисовке и сохранять остальное содержимое из предыдущего кадра. Это полезно для приложений, которые выполняют рендеринг по частям с использованием QPainter, так как таким образом им не нужно перерисовывать всё содержимое окна при каждом вызове paintGL().

Аналогично QOpenGLWidget, QOpenGLWindow поддерживает атрибут Qt::AA_ShareOpenGLContexts. При включенном значении контексты OpenGL всех экземпляров QOpenGLWindow будут общими. Это позволяет получать доступ к общим ресурсам OpenGL друг друга.

Для получения дополнительной информации о графике в Qt см. Графика.

Документация по типам членов

Перечисление QOpenGLWindow::UpdateBehavior

Это перечисление описывает стратегию обновления QOpenGLWindow.

Константа Значение Описание
QOpenGLWindow::NoPartialUpdate 0 Указывает, что вся поверхность окна будет перерисована при каждом обновлении, и поэтому дополнительные буферы кадров не нужны. Это значение используется в большинстве случаев и эквивалентно тому, как работало бы рисование напрямую через QWindow.
QOpenGLWindow::PartialUpdateBlit 1 Указывает, что рисование, выполненное в paintGL(), не покрывает всё окно. В этом случае скрытно создаётся дополнительный буфер кадра, и рисование, выполняемое в paintGL(), будет ориентировано на этот буфер. Этот буфер затем копируется на буфер кадра по умолчанию для поверхности окна после каждой перерисовки. Это позволяет использовать код рисования на основе QPainter в paintGL(), который перерисовывает только меньшую область за раз, потому что, в отличие от NoPartialUpdate, предыдущее содержимое сохраняется.
QOpenGLWindow::PartialUpdateBlend 2 Аналогично PartialUpdateBlit, но вместо использования копирования буферов кадров содержимое дополнительного буфера кадра рендерится путем рисования текстурированного квадрика с включенным смешиванием. Это, в отличие от PartialUpdateBlit, позволяет рисовать с альфа-каналом и работает даже тогда, когда glBlitFramebuffer недоступен. С точки зрения производительности, это значение, вероятно, будет немного медленнее, чем PartialUpdateBlit.

Документация по функциям членов

QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)

Создаёт новый QOpenGLWindow с заданным parent и updateBehavior. Контекст QOpenGLWindow будет использовать общий контекст с shareContext.

См. также QOpenGLWindow::UpdateBehavior и shareContext.

QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)

Создаёт новый QOpenGLWindow с заданным parent и updateBehavior.

См. также QOpenGLWindow::UpdateBehavior.

[signal] void QOpenGLWindow::frameSwapped()

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

[virtual, since 5.5] QOpenGLWindow::~QOpenGLWindow()

Уничтожает экземпляр QOpenGLWindow, освобождая его ресурсы.

Контекст OpenGLWindow делается текущим в деструкторе, позволяя безопасно уничтожить любой дочерний объект, который может потребоваться освободить ресурсы OpenGL, принадлежащие контексту, предоставляемому этим окном.

Предупреждение: если у вас есть объекты, оборачивающие ресурсы OpenGL (такие как QOpenGLBuffer, QOpenGLShaderProgram и т. д.) как члены подкласса QOpenGLWindow, вам может потребоваться добавить вызов makeCurrent() в деструктор этого подкласса тоже. Из-за правил уничтожения объектов C++, эти объекты будут уничтожены до вызова этой функции (но после того, как выполнится деструктор подкласса), поэтому сделать контекст OpenGL текущим в этой функции произойдёт слишком поздно для их безопасного уничтожения.

Эта функция была добавлена в Qt 5.5.

См. также makeCurrent.

QOpenGLContext *QOpenGLWindow::context() const

Возвращает QOpenGLContext, используемый этим окном, или 0 если он ещё не инициализирован.

GLuint QOpenGLWindow::defaultFramebufferObject() const

Дескриптор объекта фреймбуфера, используемого этим окном.

Когда поведение обновления установлено в NoPartialUpdate, нет отдельного объекта фреймбуфера. В этом случае возвращаемое значение — идентификатор стандартного фреймбуфера.

В противном случае значение идентификатора объекта фреймбуфера или 0 если он ещё не инициализирован.

void QOpenGLWindow::doneCurrent()

Освобождает контекст.

В большинстве случаев вызывать эту функцию не требуется, так как виджет позаботится о том, чтобы контекст был привязан и правильно освобождён при вызове paintGL().

См. также makeCurrent().

QImage QOpenGLWindow::grabFramebuffer()

Возвращает копию фреймбуфера.

Примечание: Это потенциально дорогостоящая операция, так как она опирается на glReadPixels() для считывания пикселей. Это может быть медленным и может приостанавливать конвейер GPU.

Примечание: При использовании поведения обновления NoPartialUpdate, возвращаемое изображение может не содержать требуемого содержимого, если оно вызывается после того, как передние и задние буферы были поменяны (если сохранение обмена включено в интерфейсе системы окон). В этом режиме функция читает из заднего буфера, и содержимое может не совпадать с содержимым на экране (передний буфер). В этом случае единственное место, где эта функция может безопасно использоваться, это paintGL() или paintOverGL().

[virtual protected] void QOpenGLWindow::initializeGL()

Этот виртуальный метод вызывается один раз перед первым вызовом paintGL() или resizeGL(). Переопределите его в подклассе.

В этом методе должны быть настроены все необходимые ресурсы и состояние OpenGL.

Вызывать makeCurrent() не нужно, так как это уже сделано при вызове этого метода. Однако обратите внимание, что фреймбуфер, в случае использования режима частичного обновления, ещё недоступен на этом этапе, поэтому избегайте вызовов рисования отсюда. Отложите такие вызовы до paintGL() вместо этого.

См. также paintGL() и resizeGL().

bool QOpenGLWindow::isValid() const

Возвращает true если ресурсы OpenGL окна, такие как контекст, были успешно инициализированы. Обратите внимание, что возвращаемое значение всегда false до тех пор, пока окно не станет видимым (отображенным).

void QOpenGLWindow::makeCurrent()

Подготавливает к отрисовке содержимого OpenGL для этого окна, делая соответствующий контекст текущим и связывая объект фреймбуфера, если он есть, в этом контексте.

В большинстве случаев вызывать эту функцию не требуется, так как она вызывается автоматически перед вызовом paintGL(). Она всё же предоставляется для поддержки расширенных многопоточных сценариев, когда поток, отличный от потока GUI или главного потока, хочет обновить поверхность или содержимое фреймбуфера. См. QOpenGLContext для получения дополнительной информации о проблемах, связанных с многопоточностью.

Эта функция также подходит для вызова, когда окно платформы уже уничтожено. Это означает, что эту функцию безопасно вызывать из деструктора подкласса QOpenGLWindow. Если родного окна больше нет, вместо него используется внеэкранная поверхность. Это гарантирует, что операции очистки ресурсов OpenGL в деструкторе всегда будут работать, если эта функция вызывается первой.

См. также QOpenGLContext, context(), paintGL() и doneCurrent().

[override virtual protected] void QOpenGLWindow::paintEvent(QPaintEvent *event)

Переопределяет: QPaintDeviceWindow::paintEvent(QPaintEvent *event).

Обработчик события event. Вызывает paintGL().

См. также paintGL().

[virtual protected] void QOpenGLWindow::paintGL()

Этот виртуальный метод вызывается всякий раз, когда нужно обновить содержимое окна. Переопределите его в подклассе.

Вызывать makeCurrent() не нужно, так как это уже сделано при вызове этого метода.

Перед вызовом этой функции контекст и фреймбуфер, если он есть, привязываются, а viewport настраивается вызовом glViewport(). Никакие другие состояния не устанавливаются, и никакое очищение или рисование не выполняется фреймворком.

Примечание: При использовании поведения частичного обновления, как PartialUpdateBlend, результат предыдущего вызова paintGL() сохраняется, и после дополнительного рисования, выполненного в текущем вызове функции, содержимое копируется или смешивается с содержимым, нарисованным непосредственно в окне в paintUnderGL().

См. также initializeGL(), resizeGL(), paintUnderGL(), paintOverGL() и UpdateBehavior.

[virtual protected] void QOpenGLWindow::paintOverGL()

Этот виртуальный метод вызывается после каждого вызова paintGL().

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

Как и paintUnderGL(), отрисовка в этой функции направлена на стандартный фреймбуфер окна, независимо от поведения обновления. Она вызывается после того, как paintGL() вернулась и копирование (PartialUpdateBlit) или рисование прямоугольника (PartialUpdateBlend) было выполнено.

См. также paintGL(), paintUnderGL() и UpdateBehavior.

[virtual protected] void QOpenGLWindow::paintUnderGL()

Виртуальный метод вызывается перед каждым вызовом paintGL().

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

Разница становится значительной при использовании PartialUpdateBlend, где используется дополнительный объект фреймбуфера. Там paintGL() обращается к этому дополнительному объекту фреймбуфера, который сохраняет его содержимое, в то время как paintUnderGL() и paintOverGL() обращаются к стандартному фреймбуферу, т. е. непосредственно к поверхности окна, содержимое которой теряется после каждого отображаемого кадра.

Примечание: Избегайте полагания на эту функцию, когда поведение обновления PartialUpdateBlit. Этот режим включает копирование дополнительного фреймбуфера, используемого paintGL(), на стандартный фреймбуфер после каждого вызова paintGL(), тем самым перезаписывая всё нарисованное в этой функции.

См. также paintGL(), paintOverGL() и UpdateBehavior.

END_OF_DOCUMENT_MARKER ```

[override virtual protected] void QOpenGLWindow::resizeEvent(QResizeEvent *event)

Реализует: QWindow::resizeEvent(QResizeEvent *ev).

Обработчик события изменения размера event. Вызывает resizeGL().

См. также resizeGL().

[virtual protected] void QOpenGLWindow::resizeGL(int w, int h)

Эта виртуальная функция вызывается всякий раз, когда виджет был изменен по размеру. Переопределите её в подклассе. Новый размер передаётся в w и h.

Примечание: Это всего лишь удобная функция для обеспечения API, совместимого с QOpenGLWidget. В отличие от QOpenGLWidget, производные классы могут свободно выбрать переопределение resizeEvent() вместо этой функции.

Примечание: Избегайте выдачи команд OpenGL из этой функции, так как в момент её вызова контекст может быть отсутствующим. Если этого избежать нельзя, вызовите makeCurrent().

Примечание: Планирование обновлений отсюда не нужно. Системы оконного интерфейса отправят события expose, которые автоматически вызовут обновление.

См. также initializeGL() и paintGL().

QOpenGLContext *QOpenGLWindow::shareContext() const

Возвращает QOpenGLContext, который требуется для совместного использования с QOpenGLContext этого окна.

QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const

Возвращает поведение обновления для этого QOpenGLWindow.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qopenglwindow.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API