hakeの日記

Windows環境でプログラミングの勉強をしています。

画像ファイルの表示

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