QOpenGLWindow Class
QOpenGLWindow クラスは、OpenGL による描画を実行するための、QWindow の利便性を高めるサブクラスです。詳細...
| ヘッダー: | #include <QOpenGLWindow> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| 継承元: | QPaintDeviceWindow |
パブリック型
| enum | UpdateBehavior { NoPartialUpdate, PartialUpdateBlit, PartialUpdateBlend } |
パブリック関数
| QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr) | |
| QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr) | |
| virtual | ~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() |
保護された関数
| virtual void | initializeGL() |
| virtual void | paintGL() |
| virtual void | paintOverGL() |
| virtual void | paintUnderGL() |
| virtual void | resizeGL(int w, int h) |
再実装されたプロテクトされた関数
| virtual void | paintEvent(QPaintEvent *event) override |
| virtual void | resizeEvent(QResizeEvent *event) override |
詳細な説明
QOpenGLWindow は、QWindow を拡張したもので、QOpenGLWidget と互換性のある API を使用して、OpenGL レンダリングを行うウィンドウを簡単に作成することができます。QOpenGLWidget とは異なり、QOpenGLWindow は widgets モジュールに依存せず、より優れたパフォーマンスを発揮します。
一般的なアプリケーションでは、QOpenGLWindowをサブクラス化し、以下の仮想関数を再実装します:
- initializeGL():OpenGLリソースの初期化を実行
- resizeGL():変換行列やその他のウィンドウサイズに依存するリソースを設定する
- paintGL():OpenGLコマンドの発行、またはQPainter
再描画をスケジュールするには、update() 関数を呼び出します。なお、これによって直ちにpaintGL() が呼び出されるわけではありません。update() を連続して複数回呼び出しても、動作は一切変わりません。
これはスロットであるため、QChronoTimer::timeout() シグナルに接続してアニメーションを実行することができます。ただし、現代の OpenGL 環境では、ディスプレイの垂直リフレッシュレートとの同期に依存する方がはるかに良い選択であることに注意してください。スワップ間隔の説明については、setSwapInterval() を参照してください。1 のスワップ間隔(ほとんどのシステムでデフォルト設定)では、各リペイント後にQOpenGLWindowによって内部的に実行されるswapBuffers()呼び出しは、vsyncを待つためにブロックされます。つまり、スワップが完了するたびに、タイマーに依存することなく、update()を呼び出すことで更新を再度スケジュールすることができます。
コンテキストに対して特定の設定を要求するには、他のQWindow と同様にsetFormat()を使用します。これにより、特定のOpenGLバージョンやプロファイルの指定、あるいは深度バッファやステンシルバッファの有効化などが可能になります。
注: 基になるウィンドウシステムインターフェースに対して深度バッファおよびステンシルバッファを要求することは、アプリケーション側の責任です 。深度バッファのサイズをゼロ以外で要求しない限り、深度バッファが利用可能になる保証はなく、その結果、深度テストに関連する OpenGL 操作が期待通りに機能しない可能性があります。
一般的に使用される深度バッファとステンシルバッファのサイズ指定は、それぞれ24と8です。たとえば、QOpenGLWindowのサブクラスは、コンストラクタ内で次のように処理できます。
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
setFormat(format);QWindow とは異なり、QOpenGLWindowでは自身に対してペインターを開き、QPainter に基づく描画を実行することができます。
QOpenGLWindowは複数の更新挙動をサポートしています。デフォルトのNoPartialUpdate は、通常のOpenGLベースのQWindow と同等です。対照的に、PartialUpdateBlit およびPartialUpdateBlend は、常に追加の専用フレームバッファオブジェクトが存在するQOpenGLWidget の動作方式により近いものです。 これらのモードでは、ある程度のパフォーマンスを犠牲にすることで、各ペイント操作でより狭い領域のみを再描画し、残りのコンテンツは前のフレームから保持することができます。これは、QPainter を使用して増分的にレンダリングを行うアプリケーションにとって有用です。なぜなら、この方法であれば、paintGL() を呼び出すたびにウィンドウの内容全体を再描画する必要がなくなるからです。
QOpenGLWidget と同様に、QOpenGLWindowはQt::AA_ShareOpenGLContexts 属性に対応しています。これを有効にすると、すべてのQOpenGLWindowインスタンスのOpenGLコンテキストが相互に共有されます。これにより、各インスタンスは互いの共有可能なOpenGLリソースにアクセスできるようになります。
Qt におけるグラフィックスに関する詳細については、「Graphics」を参照してください。
メンバ型のドキュメント
enum QOpenGLWindow::UpdateBehavior
この列挙型は、QOpenGLWindow の更新戦略を表します。
| 定数 | 値 | 説明 |
|---|---|---|
QOpenGLWindow::NoPartialUpdate | 0 | 各更新時にウィンドウ表面全体が再描画されるため、追加のフレームバッファは必要ないことを示します。これはほとんどの場合に使用される設定であり、QWindow を介して直接描画する場合の動作と同等です。 |
QOpenGLWindow::PartialUpdateBlit | 1 | paintGL() で行われる描画がウィンドウ全体をカバーしていないことを示します。この場合、内部で追加のフレームバッファオブジェクトが作成され、paintGL() で行われるレンダリングはこのフレームバッファを対象とします。その後、このフレームバッファは、各ペイントの後にウィンドウサーフェスのデフォルトのフレームバッファにブリットされます。 これにより、paintGL() 内でQPainter ベースの描画コードを使用し、一度に小さな領域のみを再描画することが可能になります。これは、NoPartialUpdate とは異なり、以前の内容が保持されるためです。 |
QOpenGLWindow::PartialUpdateBlend | 2 | PartialUpdateBlitと似ていますが、フレームバッファのブリットを使用する代わりに、追加のフレームバッファの内容は、ブレンディングを有効にしたテクスチャ付きクワッドを描画することでレンダリングされます。これにより、PartialUpdateBlitとは異なり、アルファブレンディングされたコンテンツが可能になり、glBlitFramebufferが利用できない場合でも機能します。 パフォーマンスの面では、この設定は PartialUpdateBlit よりも多少遅くなる可能性があります。 |
メンバ関数のドキュメント
[explicit] QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
指定されたparent およびupdateBehavior を使用して、新しいQOpenGLWindowを構築します。
QOpenGLWindow::UpdateBehaviorも参照してください 。
[explicit] QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
指定されたparent およびupdateBehavior を使用して、新しいQOpenGLWindowを構築します。このQOpenGLWindowのコンテキストは、shareContext と共有されます。
QOpenGLWindow::UpdateBehavior およびshareContextも参照してください 。
[virtual noexcept] QOpenGLWindow::~QOpenGLWindow()
QOpenGLWindow インスタンスを破棄し、そのリソースを解放します。
デストラクタ内で OpenGLWindow のコンテキストがアクティブに設定されるため、このウィンドウが提供するコンテキストに属する OpenGL リソースを解放する必要がある子オブジェクトを安全に破棄することができます。
警告: QOpenGLWindow のサブクラスのメンバとして、OpenGLリソース(QOpenGLBuffer 、QOpenGLShaderProgram など)をラップするオブジェクトがある場合 、そのサブクラスのデストラクタにもmakeCurrent()の呼び出しを追加する必要がある場合があります。 C++ のオブジェクト破棄のルールにより、これらのオブジェクトは本関数が呼び出される前に破棄されます(ただし、その後にサブクラスのデストラクタが実行されます)。そのため、本関数内で OpenGL コンテキストを現在のものにする処理が行われるのは、これらのオブジェクトを安全に破棄するには遅すぎます。
makeCurrentも参照してください 。
QOpenGLContext *QOpenGLWindow::context() const
このウィンドウで使用されているQOpenGLContext を返します。まだ初期化されていない場合は、0 を返します。
GLuint QOpenGLWindow::defaultFramebufferObject() const
このウィンドウで使用されるフレームバッファオブジェクトのハンドル。
更新動作がNoPartialUpdate に設定されている場合、個別のフレームバッファオブジェクトは存在しません。この場合、戻り値はデフォルトのフレームバッファのIDとなります。
それ以外の場合は、フレームバッファオブジェクトのID、またはまだ初期化されていない場合は0 が返されます。
void QOpenGLWindow::doneCurrent()
コンテキストを解放します。
paintGL() を呼び出す際、ウィジェットがコンテキストのバインドと解放を適切に処理するため、ほとんどの場合、この関数を呼び出す必要はありません。
makeCurrent()も参照してください 。
[signal] void QOpenGLWindow::frameSwapped()
このシグナルは、ブロックされる可能性のあるbuffer swap が実行された後に発信されます。垂直リフレッシュに同期して継続的に再描画を行いたいアプリケーションは、このシグナルを受け取った際にupdate()を呼び出す必要があります。これにより、従来のタイマーを使用した方法に比べて、はるかにスムーズな操作感を実現できます。
QImage QOpenGLWindow::grabFramebuffer()
フレームバッファのコピーを返します。
注:この操作は 、ピクセルを読み戻すために glReadPixels() に依存しているため、処理負荷が高くなる可能性があります。これにより処理が遅くなり、GPU パイプラインが停止する恐れがあります。
注: 更新動作NoPartialUpdate と併用する場合 、フロントバッファとバックバッファの入れ替えが行われた後にこの関数を呼び出すと、返される画像に意図した内容が含まれない可能性があります(基盤となるウィンドウシステムインターフェースで「preserved swap」が有効になっていない限り)。 このモードでは、関数はバックバッファから読み取りますが、その内容は画面(フロントバッファ)上の内容と一致しない場合があります。この場合、この関数を安全に使用できるのは、paintGL() またはpaintOverGL() のみです。
[virtual protected] void QOpenGLWindow::initializeGL()
この仮想関数は、paintGL() またはresizeGL() が最初に呼び出される前に 1 回呼び出されます。サブクラスでこれを再実装してください。
この関数では、必要な OpenGL リソースと状態を設定する必要があります。
makeCurrent() を呼び出す必要はありません。この関数が呼び出された時点で、すでにその処理は完了しているからです。ただし、部分更新モードが使用されている場合、この段階ではフレームバッファがまだ利用できないため、ここから描画呼び出しを行わないでください。そのような呼び出しは、代わりにpaintGL() まで延期してください。
paintGL() およびresizeGL()も参照してください 。
bool QOpenGLWindow::isValid() const
コンテキストなどのウィンドウの OpenGL リソースが正常に初期化された場合、true を返します。なお、ウィンドウがエクスポーズ(表示)されるまでは、戻り値は常に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() を呼び出す必要はありません。この関数が呼び出される時点で、すでにその処理は行われているためです。
この関数を呼び出す前に、コンテキストと(存在する場合の)フレームバッファがバインドされ、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も参照してください 。
[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 に渡されます。
注:これは 、QOpenGLWidget と互換性のある API を提供するための単なる便宜上の関数です。QOpenGLWidget とは異なり、派生クラスはこの関数の代わりにresizeEvent() をオーバーライドすることを自由に選択できます。
注: この関数が呼び出された時点でアクティブなコンテキストが存在しない可能性があるため、この関数から OpenGL コマンドを発行することは避けてください 。やむを得ない場合は、makeCurrent() を呼び出してください。
注: ここから更新をスケジュールする必要 はありません。ウィンドウシステムは、更新を自動的にトリガーするエクスポーズイベントを送信します。
関連項目: initializeGL() およびpaintGL()。
QOpenGLContext *QOpenGLWindow::shareContext() const
このウィンドウの `QOpenGLContext` と共有するよう要求された `QOpenGLContext ` を返します。
QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const
このQOpenGLWindow の更新動作を返します。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.