hakeの日記

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

画像ファイルの表示 その2

Ruby/Qteの勉強 その27

大きな画像を表示させたい場合はQScrollViewを使用する、メインウィンドウ上にQScrollViewの窓を用意してそこを通して画像ファイルの一部を覗くという感じ? スクロールバーを操作することで画像の各部分を表示させることができる。
大きな画像はそれなりに反応が遅いっす(^^;

@iSV = QScrollView.new( self )    # スクロールビュー作成
@iSV.setGeometry(0,100,635,300)
@image = ImgWidget.new( @iSV )    # 画像オブジェクト
@iSV.addChild( @image )

ImgWidgetクラスの中でloadした画像ファイルのサイズを取得してそれをsetFixedSizeで自分自身のサイズにしている。昨日の例では通常のメソッドdrawでも表示できたけど、スクロールさせたときの再描画が行われないことが判明。今日はpaintEventでの描画のみとした。

#!/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)

      $ebox1 = QLabel.new( self )
      $ebox1.setGeometry(0,40,600,35)

      @iSV = QScrollView.new( self )
      @iSV.setGeometry(0,100,635,300)
      @image = ImgWidget.new( @iSV )
      @iSV.addChild( @image )
      @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/zaurus/Documents/Image_Files/xxx.jpg")
      @image.update()
#      @image.dwaw      # メソッドによる描画はNG
  end
end

class ImgWidget < QWidget
   def initialize( parent )
      super( parent ) # parentが無いと表示しない
      catchEvent
   end

   def load( file )
      @image = QImage.new( file )
      x, y = @image.width, @image.height  # 画像サイズ取得
      setFixedSize( x, y)
      $ebox1.setText("Size X=#{x.to_s}, Y=#{y.to_s}") # サイズ表示
   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