hakeの日記

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

ペンで絵を描く

Ruby/Qteの勉強 その35

上のPy/QtのソースをRubyに書き換えてみた、ペンで画面をなぞって絵を描くことができる(ただし動作が重い)
画面をタップして発生するmousePressEvenでタップ座標を@px,@pyに保存する、さらに画面をなぞることでmouseMoveEventが発生。mouseMoveEventではQPixmapのオブジェクト@offscreenBufferに先程の保存した座標への6×6ドットの正方形の描画を記録、新規の座標を取得し、repaintで実際にQWidgetに描画する。実際の描画はpaintEvent内でbitBltにより@offscreenBufferの内容がコピーされる。
bitBltはQPaintDeviceのリファレンスに説明がある。
resizeEventは今回は関係ない?起動時に呼ばれるんだった。

#!/usr/bin/env ruby

require "qte"
require "qpe"
include Qte
include Qpe


class SampleWindow < QWidget
   def initialize()
      super()
#     resize(300, 324)
      @fmenu = QPopupMenu.new(self)
      @fmenu.insertItem(tr("終了"), self, 'bye', 0)
      @mb = QMenuBar.new(self)
      @mb.insertItem(tr("ファイル(&F)"), @fmenu)
      @mb.setGeometry(0, 0, 300, 24)
      setBackgroundMode(QWidget::NoBackground)
      @offscreenBuffer = nil
      @px = @py = nil

      catchEvent
   end

   def bye
      self.close()
   end

   def mousePressEvent(ev)
       @px = ev.x()
       @py = ev.y()
   end

   def mouseMoveEvent(ev)
      pa = QPainter.new()
      pa.begin(@offscreenBuffer)
      if @px != nil
         pen = QPen.new(QColor("blue"), 4, QWidget::SolidLine)
         pa.setPen(pen)
         # 線を描く
         #pa.drawLine(self.px, self.py, ev.x(), ev.y())
         # 長方形を描く
         pa.drawRect(ev.x()-3, ev.y()-3, 6, 6)
         @px = ev.x()
         @py = ev.y()
         pa.end()
         repaint()
      end
   end

   def resizeEvent(ev)
      if @offscreenBuffer == nil
         @offscreenBuffer = QPixmap.new(ev.size())
         @offscreenBuffer.fill(QWidget.white)
      else
         temp = QPixmap.new(@offscreenBuffer)
         @offscreenBuffer.resize(ev.size())
         @offscreenBuffer.fill(QWidget.white)
         bitBlt(@offscreenBuffer, 0, 0, temp)
      end
   end

   def paintEvent(ev)
      bitBlt(self, 0, 0, @offscreenBuffer)
   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