[QtRuby] QtRuby入門2(シグナルとスロット)

Qt独自の機構であるシグナルとスロットをQtRubyで定義する方法をメモっておこうじゃなイカ

1. シグナル

シグナルの定義
signals 'hoge()'

文字列として定義することさえ覚えておけば、あとはQtと同じ書き方じゃないかな?

シグナルの発行
emit hoge()

たぶんQtと同じ。

2. スロット

スロットの定義
slots 'fuga()'

これも文字列として定義すればよく、あとは基本的にQtと同じと思われ。
fugaメソッドの定義は通常のメソッドと同じ。

3. シグナルとスロットのサンプル

シグナルとスロットのサンプルとして、次のようなものを作ってみた。

サンプル

f:id:izumisannoid:20121124201143g:plain

  • 「NEXT」ボタンを押すと数字を1づつカウントアップする。
  • 数字が3の倍数の時、「ぬるぽ」シグナルを発行する。
  • ぬるぽ」シグナルは、「ガッ」スロットにコネクトしている。
  • 「ガッ」スロット(メソッド)がコールされた時、数字ではなく「ガッ」を表示する。
samplesignalslot.rb
require 'qt4'

$KCODE = "utf-8"

class MainWindow < Qt::MainWindow
  signals 'nullpo()'  # 「ぬるぽ」シグナル
  slots   'ga()'      # 「ガッ」スロット
  slots   'buttonClickedEvent()'

  def initialize
    super
    
    @count = 0
    
    setCentralWidget(Qt::Widget.new)
    resize(100, 50)
    
    vboxlayout = Qt::VBoxLayout.new
    vboxlayout.setAlignment(Qt::AlignVCenter)
    centralWidget.setLayout(vboxlayout)
    
    @label = Qt::Label.new
    @label.setText(@count.to_s)
    @label.setAlignment(Qt::AlignHCenter)
    vboxlayout.addWidget(@label)
    
    @button = Qt::PushButton.new("NEXT")
    vboxlayout.addWidget(@button)
    
    connect(@button, SIGNAL('clicked()'),\
            self,    SLOT('buttonClickedEvent()'))
    
    # 「ぬるぽ」シグナルと「ガッ」スロットをコネクト
    connect(self, SIGNAL('nullpo()'), self, SLOT('ga()'))
  end
  
private
  # ボタンが押された時の処理
  def buttonClickedEvent
    @count += 1
    @label.setText(@count.to_s)
    
    # 3の倍数の時に「ぬるぽ」する
    if @count % 3 == 0
      emit nullpo  # 「ぬるぽ」シグナルの発行
    end
  end
  
  # 「ガッ」ってする
  def ga
    @label.setText("ガッ")
  end
end

app = Qt::Application.new(ARGV)
w = MainWindow.new
w.show
app.exec

普通のメソッドとQt独特のシグナル・スロットの使い分けなんて理解してないけど、定義して使うのは簡単だね。