QtでOpenGL描画

※環境はQt SDK 4.7.3, OpenGL 2.1
QtでOpenGLを利用するにはQGLWidgetクラスを利用します。このクラスはOpenGL絡みの抽象メソッドを3つ持っています。
・initializeGL(初期化処理)
・resizeGL(フレームバッファサイズ変更時処理)
・paintGL(描画処理)
実際にはQGLWidgetの派生クラスのメソッド内に実処理を書き加えることになります。

Qtプロジェクト作成

まずは空プロジェクトを作成します。(ここではQGL_test.proという名称を付けたとしましょう。)
そしてC++ソースをプロジェクトに追加してmain関数を作成します。

main.cpp
#include <qapplication.h>
#include "canvaswidget.h"

int main( int argc, char **argv )
{
  QApplication app(argc, argv);
  CanvasWidget widget;
  widget.setGeometry( 100, 100, 200, 300 );
  widget.show();
  return app.exec();
}

QGLWidgetの派生クラスであるCanvasWidgetクラスをプロジェクトに追加し、描画処理を実装します。

canvaswidget.h(インクルードガード略)
#include <QGLWidget>
class CanvasWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit CanvasWidget(QWidget *parent = 0 , const char *name = 0);
    virtual void initializeGL();
    virtual void resizeGL( int width, int height );
    virtual void paintGL();
signals:
public slots:
};
canvaswidget.cpp
#include "canvaswidget.h"
CanvasWidget::CanvasWidget(QWidget *parent, const char *name) : QGLWidget(parent){}

void CanvasWidget::initializeGL(){
    int width = geometry().width();
    int height = geometry().height();
    glViewport(0,0, width, height);
    glMatrixMode(GL_PROJECTION);
    glOrtho(-width *0.5, width*0.5, -height* 0.5, height* 0.5, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
void CanvasWidget::resizeGL( int width, int height ){
    glViewport(0,0,width,height);
}
void CanvasWidget::paintGL(){
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glColor4f(1.0f,0.0f,0.0f,1.0f);
    glBegin(GL_TRIANGLES);
      glVertex3f( -100.0f, 100.0f, 0.0f);
      glVertex3f(-100.0f,-100.0f, 0.0f);
      glVertex3f( 100.0f,-100.0f, 0.0f);
    glEnd();
}

コンパイルオプションの設定

プロジェクトファイルに以下を追記します。

QGL_test.pro
QT += opengl

これでビルド&実行して赤い三角形が表示されればOKです。