最後に、連載を通して用いるサンプルプログラムについて説明しておきましょう。作るのは画像ファイルのビューワです。
ファイルビューワの最初のバージョンは、表14のようなファイル構成となります。今回作成するプログラムは、次のWebページからダウンロードできます。ソースコードも長くないので、ぜひ動かしたり改造したりしてみてください。
http://www.unixuser.jp/info/#200501
| ファイル | 説明 |
|---|---|
| main.cpp | テスト用のメイン |
| picturewidget.h | 画像を表示するウィジェットのヘッダー部 |
| picturewidget.cpp | 同実装部 |
| picsview.pro | qmakeの.proファイル |
| images/designer_ | デフォルト画像。.proファイルのIMAGESに指定して、プログラムバイナリに取り込んでいる |
| 表14 最初のバージョンのファイル構成 | |
プログラムのビルドは次の手順でできます。
$ cd picsview $ qmake $ make
コマンドラインの第1パラメータに何も指定しないとデフォルトの画像が表示され、画像ファイルを指定するとそのファイルが表示されます。このプログラムの実行例は図5のようになります。
サンプルプログラム(リスト7)の要点を説明します。
まず15行目です。.proのIMAGESで指定した画像が、ソースコードとしてqmake_image_collection.cppに取り込まれます。取り込まれた画像は、ファイル名をキーにしてQPixmap::fromMimeSource()を呼ぶことで取得できます。このときの画像の形式はpixmapです。
次は43行目です。PictureWidget::paintEventは再描画が必要なときに呼ばれる仮想メンバー関数です。変数event中には、再描画が必要な矩形集合の情報が入っています。
最後は44〜47行です。PictureWidget::paintEventでは、新たに画面上に現れて、再描画が必要になった矩形領域のみを、オフラインに保持した画像から再表示しています。こうすると、すでに表示している領域は再描画されないので、若干ながら表示効率が良くなります。
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形式プラグインの機能追加や組み込みらしくタイトルバーなしの全画面表示や、ソフトウェアマウスカーソルの非表示などを実装します。
Copyright(c)2010 SOFTBANK Creative Inc. All rights reserved.