hakeの日記

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

時刻表示とタイマー

Ruby/Qteの勉強 その37

画面に現在時刻を表示、スタートボタンで開始、ストップボタンで停止します。
時計の表示はQLCDNumberのオブジェクトを8桁で使用しています。QTimerのオブジェクト@timerを作成しスタートボタンが押されると1秒毎にシグナルtimeoutが発生、これを受けてメソッドdiaplayが実行されます。ちなみに@timer.startの第2引数をtrueにすると1回のみのシグナル発生になります。
メソッドdisplayでは、Qtimeのオブジェクトにより現在時刻を取得、これを変換して時刻表示させています。


あー、こんな便利なクラスにもっと早く気付いてたらSHOUTcastPlayerのスリープ機能もあんなに苦労しなくて済んだのに……orz

#!/usr/bin/env ruby

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

class SampleWindow < QMainWindow
   def initialize()
      super()
      setCaption(tr("サンプル"))

      @v = QVBoxLayout.new(self, 20)

      @lcd = QLCDNumber.new(8, self)
      @lcd.setSegmentStyle( QLCDNumber::Flat )
      @h = QHBox.new(self)
         @pbstart = QPushButton.new(tr("スタート"), @h)
         connect(@pbstart, QSIGNAL("clicked()"), self, 'start')
         @pbstop = QPushButton.new(tr("ストップ"), @h)
         connect(@pbstop, QSIGNAL("clicked()"), self, 'stop')

      # 画面レイアウト
      @v.addWidget(@lcd, 1)          # LCDを大きく表示
      @v.addWidget(@h)

      @timer = QTimer.new(self)
      # 設定した時間が経過したらシグナル発生
      connect(@timer, QSIGNAL("timeout()"), self, 'display')

      @now = QTime.new(0, 0)
      display
   end

   # 現在時刻表示
   def display
      @now.start                   # 現在時刻取得
      @nowstr = @now.toString      # QStringに変換
      @lcd.display(@nowstr)        # 表示
   end

   # スタート
   def start
      @timer.start(1000, false)  # 1sec毎にシグナル発生
   end

   # タイマストップ
   def stop
      @timer.stop
   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