QtRuby を使ってみました


はじめに

今回で4回目の投稿となります、ynuma です。
近況を簡単に書かせていただきます。

私事で恐縮ですが、3月に待望の第一子が誕生しました!!
自分で言うのも何ですが、親バカが止まりません。
子供の為にも、より一層仕事も頑張りたいと思っています。

その仕事についてですが、相変わらず HW の開発が中心です。
SW については触れる機会が少なく、さらに家の手伝いやら会社のお仕事の関係で、勉強する時間が減ってきているので、正直なところ Qt のトレンドは把握できていません。
今回の記事の内容は少々古いかもしれませんが、ご了承ください。

本題になりますが、今回のテーマは QtRuby についてです。
このテーマを選んだ理由ですが、普段 HW の評価ツールを作成する際、オブジェクト指向言語の ruby
を使用することが多いので、ruby で GUI も表示させるために、Qt を使えるようにしたい、というのが個人的な目標です。
最近のスクリプト型言語のトレンドとしては、ruby より python でしょうが、個人的には日本生まれの ruby を応援しています。
QtRuby のユーザーは限られているかと思われますが、この記事が何かお役に立てればと思っています。

QtRuby について

QtRuby は Qt framework を呼び出せるようにしたライブラリという認識です。
後述のパッケージ名を見ていただくとわかりますが、最近では qtbindings という言い方もされているかと思われます。
binding しているということは、インタフェースのみを提供しているものと思われます。
今回は時間がないので、QtRuby の実装を確認できませんでしたが、余力がある時確認してみる予定です。

実用例

ざっと、以下のものが見つかりました。

Kubeplayer:
KDE が開発した online video player のようです。これによく似た名前の TubePlayer とは異なります。

Kaya:
KDE の board game suite. チェスと将棋があるらしいですが、しばらく更新されていないようです。
https://github.com/pcapriotti/kaya/wiki/Kaya

Yast2:
オペレーティングシステムの設定と構成管理のためのツールで、openSUSE等に採用されているそうです。

他にもご存知の方いらっしゃいましたらご教授いただければ幸いです。

package

Windows では以前 qtruby4 というパッケージを install していたようですが、最近では qtbindings というパッケージに変わっているようです。
これは、元々 Mac OS や Linux 向けのパッケージだったようですが、共通化されたようです。
https://github.com/ryanmelt/qtbindings

また、Qt 5.4 以降では、ruby-qml というものを用いることにより、QML/Qt Quick を呼び出せるようになった模様です。
ただし、Qt 5.x では QtRuby(qtbindings) は使えないそうです。

qtbindings 対応の Qt 最新環境

Qt4.8.6.4: Ruby2.4 用
Qt4.8.6.3: Ruby2.0~2.3 用

必要なツール

不要なものが含まれていそうで自信がないのですが、以下のツールを install しました。

Qt: 4.8.6.4
CMake: 3.6.x(個人的には 3.6.10-1 を使用)
OpenSSL 1.0.2 x64(Lightでないもの)
Ruby: 2.4.2(installed from rubyinstaller.org)
gcc: 4.x, 5.x, or 6.x
今回は Windows でセットアップしました。
gcc については、MSYS2 という linux と同じコマンドライン環境を整えるツールがあるので、これを install しました。
参考⇒https://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049

qtbindings: 4.8.6.4
ruby 2.4.2 のコマンドプロンプトから以下の通り install します。

$ gem update --system
$ gem install rake
$ gem install qtbindings

自動で 4.8.6.4 が install されます。

※ 何かお気づきの点がありましたら、フィードバックいただければ幸いです。

サンプルコード

試しによくあるサンプルコードを動かしてみました。

mainwindow.rb
require 'Qt'

a = Qt::Application.new(ARGV)
hello = Qt::PushButton.new('Congratulation QtRuby!', nil)
hello.resize(800, 200)
hello.show()
a.exec()

実行結果

やっと実行できるようになりました。

終わりに

今回はサンプルを動かすところまでで時間切れとなりました。
次回は ruby と Qt という強力なコラボで、簡単なアプリケーションを作ってみようと思います。