特集
» 2004年12月18日 10時00分 公開

UNIX USER1月号「デスクトップで動かす・学ぶQt/Embedded」より転載:Qt/Embeddedのインストール――第1回 フレームバッファでQtアプリ(その3) (5/5)

[杉田研治,UNIX USER]
前のページへ 1|2|3|4|5       
サンプルプログラム

 最後に、連載を通して用いるサンプルプログラムについて説明しておきましょう。作るのは画像ファイルのビューワです。

ファイル構成

 ファイルビューワの最初のバージョンは、表14のようなファイル構成となります。今回作成するプログラムは、次のWebページからダウンロードできます。ソースコードも長くないので、ぜひ動かしたり改造したりしてみてください。

http://www.unixuser.jp/info/#200501

表14 最初のバージョンのファイル構成
ファイル 説明
main.cpp テスト用のメイン
picturewidget.h   画像を表示するウィジェットのヘッダー部
picturewidget.cpp 同実装部
picsview.pro qmakeの.proファイル
images/designer_ デフォルト画像。.proファイルのIMAGESに指定して、プログラムバイナリに取り込んでいる

プログラムのビルド手順と動作確認

 プログラムのビルドは次の手順でできます。

$ cd picsview
$ qmake
$ make

 コマンドラインの第1パラメータに何も指定しないとデフォルトの画像が表示され、画像ファイルを指定するとそのファイルが表示されます。このプログラムの実行例は図5のようになります。

図5 図5 画像ビューワプログラム(第1版)の実行例(クリックで拡大します)

サンプルプログラムの説明

 サンプルプログラム(リスト7)の要点を説明します。

 まず15行目です。.proのIMAGESで指定した画像が、ソースコードとしてqmake_image_collection.cppに取り込まれます。取り込まれた画像は、ファイル名をキーにしてQPixmap::fromMimeSource()を呼ぶことで取得できます。このときの画像の形式はpixmapです。

 次は43行目です。PictureWidget::paintEventは再描画が必要なときに呼ばれる仮想メンバー関数です。変数event中には、再描画が必要な矩形集合の情報が入っています。

 最後は44〜47行です。PictureWidget::paintEventでは、新たに画面上に現れて、再描画が必要になった矩形領域のみを、オフラインに保持した画像から再表示しています。こうすると、すでに表示している領域は再描画されないので、若干ながら表示効率が良くなります。

リスト7 画像ビューワプログラム(第1版)のコード(picturewidget.cpp)
 1    #include <qpixmap.h>
 2    #include "picturewidget.h"
 3
 4    class PictureWidgetPrivate {
 5    public:
 6        QString fileName;
 7        QPixmap pixmap;
 8    };
 9
10    PictureWidget::PictureWidget( QWidget* parent, const char* name, WFlags f )
11        : QWidget( parent, name, f )
12    {
13        setBackgroundMode( NoBackground );
14        d = new PictureWidgetPrivate;
15        d->pixmap = QPixmap::fromMimeSource( "designer_qtlogo.png" );
16        setFixedSize( d->pixmap.size() );
17    }
18
19    PictureWidget::~PictureWidget()
20    {
21        delete d;
22    }
23
24    bool PictureWidget::loadImage( const QString& fileName )
25    {
26        if ( !d->pixmap.load( fileName ) ) {
27            return false;
28        }
29
30        d->fileName = fileName;
31        setFixedSize( d->pixmap.size() );
32        update();
33        updateGeometry();
34
35        return true;
36    }
37
38    const QString& PictureWidget::fileName() const
39    {
40        return d->fileName;
41    }
42
43    void PictureWidget::paintEvent( QPaintEvent* event )
44    {
45        QMemArray<QRect> rects = event->region().rects();
46        for ( uint i = 0; i < rects.size(); ++i ) {
47            bitBlt( this, rects[i].topLeft(), &d->pixmap, rects[i] );
48        }
49    }
50
51    QSize PictureWidget::sizeHint() const
52    {
53        return QSize( d->pixmap.width(), d->pixmap.height() );
54    }

最後に

 第1回は、Qt/Embeddedを用いて、デスクトップ上でフレームバッファを使用してプログラムが動かせるまでを中心に説明しました。次回は、カスタマイズとチューニングを中心に説明します。サンプルプログラムもタイトルバーが付くなどグレードアップします。また、TIFF形式プラグインの機能追加や組み込みらしくタイトルバーなしの全画面表示や、ソフトウェアマウスカーソルの非表示などを実装します。

UNIX USER 1月号表紙 最新号:UNIX USER 1月号の内容

第1特集
Firefoxの飼い方

第2特集
どれを選ぶ? ウイルス対策製品

[特別企画]
・ついに登場! Fedora Core 3
・最新版FreeBSD 5.3-RELEASEの活用術


前のページへ 1|2|3|4|5       

Copyright(c)2010 SOFTBANK Creative Inc. All rights reserved.

注目のテーマ