画像ファイルの表示
Ruby/Qteの勉強 その26
メインウィンドウに画像を表示させてみる。下のスクリプトで表示ボタンを押すと指定した画像ファイルがロードされて表示します、大きな画像は一部のみの表示となります(当然) このスクリプトはおかださんのEBtのソースをなぞったものなので自分でも動作を良く理解していません。
まず画像の表示エリアとして機能するQWidget派生クラスのImgWidgetを作成しています。メソッドloadは実際の画像ファイルをQImageのオブジェクトとして作成します。実際の描画はQPainterのオブジェクトで行う。
class ImgWidget < QWidget def initialize( parent ) super( parent ) catchEvent end def load( file ) @image = QImage.new( file ) end def paintEvent( e ) # または def draw …… @paint = QPainter.new( self ) @paint.drawImage( 0, 0, @image) @paint.end end end
メインウィンドウ側でこのImgWidgetクラスのインスタンス@imageを作成していますが、このときにloadメソッドを呼ばないとプログラムが強制終了してしまいました。これを回避する為にイニシャル時にはnilを引数としてloadメソッドをダミーで呼んでいます。
表示ボタンが押されたときに実際のファイル名を引数として、改めてloadメソッドを呼んでいる、このときに一緒にupdateを呼ぶことでpaintEventを発生させ描画している(updateはQWidgetのSlot?) 別の方法としてイベントの発生を使わずに通常のメソッドを使用して描画させることもできました。
#!/usr/bin/env ruby require "qte" require "qpe" include Qte include Qpe class SampleWindow < QMainWindow def initialize() super() setCaption(tr("サンプル")) @msg = QLabel.new(tr("画像表示のサンプル"),self) @msg.setGeometry(0,0,310,35) @image = ImgWidget.new( self ) @image.setGeometry(0,100,635,300) # 画像表示エリア @image.load( nil ) # ダミーロードしないと終了してしまう @pb1 = QPushButton.new( tr("表示"), self) @pb1.setGeometry(320,5,100,30) connect(@pb1, QSIGNAL("clicked()"), self, 'drawImage') end def drawImage #画像ファイルのロードと表示 # @image.load("/home/QtPalmtop/pics/Zaurus_logo.png") @image.load("/home/QtPalmtop/pics144/Startup_screen.bmp") # @image.load("/home/zaurus/Documents/Image_Files/xxx.jpg") @image.update # paintEventによる描画 # @image.dwaw # メソッドによる描画 end end class ImgWidget < QWidget def initialize( parent ) super( parent ) # parentが無いと表示しない catchEvent end def load( file ) @image = QImage.new( file ) end # def draw # @paint = QPainter.new( self ) # @paint.drawImage( 0, 0, @image) # @paint.end # end def paintEvent( e ) @paint = QPainter.new( self ) @paint.drawImage( 0, 0, @image) @paint.end end end $defaultCodec = QTextCodec.codecForName("utf8") app = QPEApplication.new([$0]+ARGV) app.setDefaultCodec($defaultCodec) QApplication.setFont(QFont.new("lcfont",18)) app.showMainWidget(SampleWindow.new) app.exec