QImageを利用してQGLWidgetに画像を描画する

QImageクラス

QImageはpngやjpgなどいくつかのフォーマットの画像を読み込んでRawデータを保持することができるクラスです。
利用するときはqimage.hをインクルードすればよいです。

#include <qimage.h>

画像の読み込み

loadメソッドを使います。

QImage img;
bool ret = img.load("icon.png");
if ( !ret ) {
    // error
}

OpenGL形式への変換

OpenGLAPIで利用できるフォーマットに変換するには、convertToGLFormatメソッドを利用します。(静的メソッドなので注意)。変換後は例えばglTexImage2DやglDrawArrayで利用できます。
画像幅width(), 画像の高さheight(), バッファアドレスbit()以外の動作は保証できないので、一旦変換してしまうと通常のQImageとしては使えないようです。またフォーマットはGL_RGBAを指定しておきます。

QImage img;
img.load("icon.png");
QImage glimg = QGLWidget::convertToGLFormat( img );
glDrawPixels( img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, glimg.bits() );

QGLWidgetへの描画

以下、簡単な実装例です。

CanvasWidget.h
#include <QGLWidget>
#include <qimage.h>
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();
private:
    QImage img;
};
CanvasWidget.cpp
#include "canvaswidget.h"
#include <qgl.h>
CanvasWidget::CanvasWidget(QWidget *parent, const char *name) : QGLWidget(parent){}

void CanvasWidget::initializeGL(){
    img.load("icon.png");
    // check load error here
    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 );
    QImage glimg = QGLWidget::convertToGLFormat( img );
    glDrawPixels( img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, glimg.bits() );
}
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();
}