Qt5でOpenGLを使用する
概要
Qt5でOpenGLを使うにはQOpenGLWidgetクラスとQOpenGLFunctionsクラスを使用します。
今回はプロジェクト作成から画面のクリアまで行います。
実行環境
手順
- Qt Widget Applicationのプロジェクトの作成
- QOpenGLWidgetクラスを継承したGLWidgetクラスの作成
- QOpenGLWidgetクラスの関数のオーバーライド
- OpenGLのバージョンの指定
- 描画部分の作成
- GLWidgetをMainWindowにセット
ソースコード
<glwidget.h>
#ifndef GLWIDGET_H #define GLWIDGET_H #include <QOpenGLWidget> #include <QOpenGLFunctions> class GLWidget : public QOpenGLWidget, public QOpenGLFunctions { Q_OBJECT public: GLWidget(QWidget *parent = nullptr); virtual ~GLWidget(); void initializeGL(); void paintGL(); void resizeGL(int w, int h); }; #endif // GLWIDGET_H
<glwidget.cpp>
#include "glwidget.h" GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) { } GLWidget::~GLWidget() { } void GLWidget::initializeGL() { initializeOpenGLFunctions(); } void GLWidget::paintGL() { glClearColor(0.0f, 0.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } void GLWidget::resizeGL(int w, int h) { Q_UNUSED(w); Q_UNUSED(h); }
<main.cpp>
#include "mainwindow.h" #include <QApplication> #include <QSurfaceFormat> int main(int argc, char *argv[]) { QSurfaceFormat fmt; fmt.setVersion(4,0); QSurfaceFormat::setDefaultFormat(fmt); QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
<mainwindow.h>
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
<mainwindow.cpp>
#include "mainwindow.h" #include "ui_mainwindow.h" #include "glwidget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); GLWidget* glw = new GLWidget(this); this->setCentralWidget(glw); } MainWindow::~MainWindow() { delete ui; }
詳細
1. Qt Widget Applicationのプロジェクトの作成
Qt Creatorの「ファイル」→「ファイル/プロジェクトの新規作成」から「Qt Widgets Application」を選択してプロジェクトを作成します。
2. QOpenGLWidgetクラスを継承したGLWidgetクラスの作成
Qt CreatorでSourcesのところを右クリックして「Add New...」でC++クラスを追加します。
基底クラスはQWidgetにします。
生成されたGLWidgetクラスはQWidgetクラスを継承しているので、ここをQOpenGLWidgetクラスに書き換えます。また、QOpenGLFunctionsクラスも継承させます。
QOpenGLFunctionsに関してはGLWidgetが所有するようにしてもいいですが、継承した方が便利だったので継承させました。
3. QOpenGLWidgetクラスの関数のオーバーライド
QOpenGLWidgetクラスを使うときは以下の3つの関数をオーバーライドして使います。
- void initializeGL();
OpenGLの初期化時に呼ばれる関数。QtでOpenGLの関数を使用するにはQOpenGLFunctionsクラスのinitializeOpenGLFunctions関数を呼ぶ必要がありますので、この初期化のタイミングで呼びます。 - void paintGL();
OpenGLの描画時に呼ばれる関数。今回は画面をクリアする関数をここで呼びます。 - void resizeGL(int w, int h);
Widgetのサイズが変わったときに呼ばれる関数。引数のwとhにはWidgetの幅と高さが入ります。
4. OpenGLのバージョンの指定
使用するOpenGLのバージョンの指定はQSurfaceFormatクラスのsetDefaultFormat関数で行います。
QtのドキュメントによるとsetDefaultFormat関数はQApplicationを生成する前に呼ぶことが推奨されているので
main関数の最初のところで呼びます。
5. 描画
QOpenGLWidgetクラスではOpenGLの描画が必要な時にpaintGL関数が呼ばれます。
ここでglDrawArrays関数などを呼んでポリゴンを描画しますが、今回は画面のクリアだけなので使用しません。
6. GLWidgetをMainWindowにセット
GLWidgetクラスをMainWindowクラスの中で生成し、setCentralWidget関数でセントラルウィジェットに設定します。
setCentralWidgetでウィジェットをセットするとdeleteはMainWindowクラスが行うので、自分でdeleteする必要はありません。
以上です。
QtでOpenGLを使う際にたくさん躓いたので備忘録として書きました。
いろいろと初心者ですので、間違い等ご指摘いただけますと幸いです。