[QtRuby] uiファイルの利用(rbuic4)

QtCreatorでGUIをデザインし、生成されるuiファイルをQtRubyで利用できるらしいので試したみた。

0. uiファイルの準備

とりあえず、QtCreatorで次のようなサンプルを準備。

mainwindow.ui

f:id:izumisannoid:20121202230311j:plain

ボタンを準備してるけど、これはどこにもコネクトしていない。

1. uiファイルの変換

rbuic4コマンドでuiファイルを指定すると、ui_mainwindow.h相当のrubyスクリプトを標準出力に出力してくれるので、これを適当なファイルに保存する。

$ rbuic4 mainwindow.ui > ui_mainwindow.rb

生成した"ui_mainwindow.rb"の中を見たらわかると思うけど、ui_mainwindow.hと全く同じ内容になってる。

2. uiスクリプトの利用

1で生成された"ui_mainwindow.rb"には、デザイナで配置した各ヴィジェットが定義されているので、これを利用するコードを書けばよい。

利用側のコードは、Qt/C++とほほ同じで、

  1. Uiモジュール内のMainWindowクラスのオブジェクトを生成
  2. 生成したオブジェクトのsetupUiメソッドを呼び出し、各ヴィジェットを生成

すればよい。

サンプルとしてはこんな感じ。

use_ui_file.rb
require 'qt4'
require "mainwindow.rb"
app = Qt::Application.new(ARGV)
w = MainWindow.new
w.show
app.exec
mainwindow.rb
require 'qt4'
require "ui_mainwindow.rb"

class MainWindow < Qt::MainWindow
  slots 'countUp()'
  slots 'countDown()'

  def initialize
    super
    @ui = Ui::MainWindow.new
    @ui.setupUi(self)
    
    connect(@ui.upButton, SIGNAL('clicked()'), self, SLOT('countUp()'))
    connect(@ui.downButton, SIGNAL('clicked()'), self, SLOT('countDown()'))
  end
  
private
  def countUp
    num = @ui.lcdNumber.intValue
    @ui.lcdNumber.display(num+1)
  end
  
  def countDown
    num = @ui.lcdNumber.intValue
    @ui.lcdNumber.display(num-1)
  end
end
完成品

f:id:izumisannoid:20121202230314j:plain


QtCreatorのデザイナを使って視覚的にGUIを生成できる!!!
QtRuby万歳!!!