サンプルプログラム |
最後に、連載を通して用いるサンプルプログラムについて説明しておきましょう。作るのは画像ファイルのビューワです。
ファイルビューワの最初のバージョンは、表14のようなファイル構成となります。今回作成するプログラムは、次のWebページからダウンロードできます。ソースコードも長くないので、ぜひ動かしたり改造したりしてみてください。
http://www.unixuser.jp/info/#200501
|
プログラムのビルドは次の手順でできます。
$ 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では、新たに画面上に現れて、再描画が必要になった矩形領域のみを、オフラインに保持した画像から再表示しています。こうすると、すでに表示している領域は再描画されないので、若干ながら表示効率が良くなります。
リスト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月号の内容
第1特集
第2特集
[特別企画] |
Copyright(c)2010 SOFTBANK Creative Inc. All rights reserved.