Spec-Zone.ru › Qt 5.9

Класс QOpenGLWindow

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

Заголовок: #include <QOpenGLWindow>
qmake: QT += gui
С тех пор: Qt 5.4
Наследует: QPaintDeviceWindow
  • Список всех членов, включая унаследованные

Открытые типы

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

Открытые функции

QOpenGLWindow(UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = Q_NULLPTR)
QOpenGLWindow(QOpenGLContext *shareContext, UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = Q_NULLPTR)
~QOpenGLWindow()
QOpenGLContext * context() const
GLuint defaultFramebufferObject() const
void doneCurrent()
QImage grabFramebuffer()
bool isValid() const
void makeCurrent()
QOpenGLContext * shareContext() const
UpdateBehavior updateBehavior() const
  • 2 открытых функции унаследованные от QPaintDeviceWindow
  • 80 открытых функций унаследованные от QWindow
  • 14 открытых функций унаследованные от QPaintDevice
  • 32 открытых функции унаследованные от QObject
  • 6 открытых функций унаследованные от QSurface

Сигналы

void frameSwapped()
  • 18 сигналов унаследованные от QWindow
  • 2 сигнала унаследованные от QObject

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

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

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

виртуальный void paintEvent(QPaintEvent *event)
виртуальный void resizeEvent(QResizeEvent *event)
  • 1 защищенная функция унаследованная от QPaintDeviceWindow
  • 18 защищенных функций унаследованных от QWindow
  • 1 защищенная функция унаследованная от QPaintDevice
  • 9 защищенных функций унаследованных от QObject

Дополнительные унаследованные члены

  • 16 свойств унаследованных от QWindow
  • 1 свойства унаследованные от QObject
  • 1 открытый слот унаследованный от QPaintDeviceWindow
  • 22 открытых слотов унаследованные от QWindow
  • 1 открытый слот унаследованный от QObject
  • 1 статический открытый член унаследованный от QWindow
  • 11 статических открытых членов унаследованные от QObject

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

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

QOpenGLWindow — это улучшенный QWindow, который позволяет легко создавать окна, выполняющие отрисовку OpenGL, используя API, совместимый с QOpenGLWidget и похожий на устаревший QGLWidget. В отличие от 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 позволяет открыть рисовальщик на себе и выполнить рисование на основе QPainter.

QOpenGLWindow поддерживает несколько стратегий обновления. По умолчанию, NoPartialUpdate эквивалентно обычному QWindow или устаревшему QGLWidget на основе OpenGL. В отличие от этого, 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(UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = Q_NULLPTR)

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

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

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

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

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

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().

[signal] void QOpenGLWindow::frameSwapped()

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

QImage QOpenGLWindow::grabFramebuffer()

Возвращает 32-битовое RGB изображение буфера кадров.

Примечание: Это потенциально дорогостоящая операция, так как она использует 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(). Она всё же предоставляется для поддержки расширенных многопоточных сценариев, когда поток, отличный от потока графического интерфейса или главного потока, может захотеть обновить поверхность или содержимое буфера кадров. См. QOpenGLContext для получения дополнительной информации о проблемах, связанных с потоками.

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

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

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

Переопределено из QPaintDeviceWindow::paintEvent().

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

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

[virtual protected] void QOpenGLWindow::paintGL()

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

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

Перед вызовом этой функции контекст и буфер кадров (если он есть) связываются, а порт отображения настраивается с помощью вызова 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.

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

Переопределено из QWindow::resizeEvent().

Обработчик события изменения размера. Вызывает 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 этого окна.

UpdateBehavior QOpenGLWindow::updateBehavior() const

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

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

Spec-Zone.ru

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