Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 |

2005-11-04(Fri)

ペンで絵を描く

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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20051104/p2