Yamamoto's Laboratory
 
Version 3
OpenGL(2D)
 
Version 4
 
 

QtOpenGLVersion 3

Qtで,OpenGLを使う方法を示します.

目次


はじめに

QtではOpenGLの機能を使える.これにはQGLWidgetを使う.QGLWidgetとはOpenGLの絵が出せるQWidgetと考えればよい.QGLWidgetを使うときには,一つ注意しなければいけないことがある.それはコンパイルするときに,普通は

$ qmake -project
$ qmake
$ make

とするが,これではOpenGLのコンパイルができない.どうするかというと,qmakeをした後に*.proというファイルができあがるのでそれに

CONFIG += opengl

という行を足しておく.どうしてこんなに面倒なことをするのかよく分からないが,とりあえずこうしなければならない.

OpenGLの使い方は,「GLUTによる「手抜き」OpenGL入門」にとてもわかりやすくかかれています.このページではGLUTでOpenGLを使っています.ここではGLUTの代わりにQtでOpenGLを使う方法を説明します.「GLUTによる「手抜き」OpenGL入門」の中のgl*()という部分はOpenGLの関数なのでそれを参考にしてください.

プログラム

OpenGLの機能を使う場合は,QGLWidgetを継承したクラスを作る.例えば,QopenGLというクラスは,

class QopenGL : public QGLWidget
{
  Q_OBJECT

public:
  QopenGL( QWidget *parent = 0 , const char *name = 0 );

protected:
  void initializeGL();
  void resizeGL(int width, int height);
  void paintGL();

};

のように定義する.ここで,initializeGL()は最初の設定をしておき,resizeGLでWidgetの大きさが変わったときの設定をしておく.そして,paintGL()の中で描画を指定する.作成したプログラムを以下に示す.

ヘッダーファイル (qopengl.h).

001   #ifndef QOPENGL_H
002   #define QOPENGL_H
003   #include <qgl.h>
004   
005   class QopenGL : public QGLWidget
006   {
007     Q_OBJECT
008   
009   public:
010     QopenGL( QWidget *parent = 0 , const char *name = 0 );
011   
012   protected:
013     void initializeGL();
014     void resizeGL(int width, int height);
015     void paintGL();
016   
017   };
018   
019   #endif

ソースファイル (qopengl.cpp).

001   #include <iostream>
002   
003   #include "qopengl.h"
004   
005   using namespace std;
006   
007   QopenGL::QopenGL( QWidget *parent, const char *name)
008     : QGLWidget(parent, name)
009   {
010   
011   }
012   
013   void QopenGL::initializeGL()
014   {
015     glClearColor(0.9, 0.9, 0.9, 1.0);
016     glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
017   }
018   
019   void QopenGL::resizeGL(int width, int height)
020   {
021     glViewport(0, 0, width, height);
022     glLoadIdentity();
023     glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
024   }
025   
026   void QopenGL::paintGL()
027   {
028     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
029   
030     //描画をここにかく
031     glColor3d( 0.0, 0.0, 1.0);
032     glBegin(GL_QUADS);
033     glVertex2d(0.1, 0.1);
034     glVertex2d(0.9, 0.1);
035     glVertex2d(0.9, 0.9);
036     glVertex2d(0.1, 0.9);
037     glEnd();
038   
039   }
040   
041   

ソースファイル (main.cpp).

001   #include <qapplication.h>
002   
003   #include "qopengl.h"
004   
005   int main(int argc, char *argv[])
006   {
007     QApplication app(argc, argv);
008   
009     QopenGL* gl = new QopenGL;
010     gl->resize(300, 300);
011   
012     app.setMainWidget(gl);
013     gl->show();
014     return app.exec();
015   }

できあがったプログラムを実行すると,以下のウィンドウが現れる.

OpenGL_Window
プログラムの実行結果


no counter