[QtRuby] uiファイルの利用(rbuic4)
QtCreatorでGUIをデザインし、生成されるuiファイルをQtRubyで利用できるらしいので試したみた。
0. uiファイルの準備
とりあえず、QtCreatorで次のようなサンプルを準備。
mainwindow.ui
ボタンを準備してるけど、これはどこにもコネクトしていない。
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++とほほ同じで、
- Uiモジュール内のMainWindowクラスのオブジェクトを生成
- 生成したオブジェクトの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