2010年01月24日

Windows向けGUIツールキットを色々と試す(1)

マイコンボードのデモ用にGUI付きのツールを作る必要に迫られたので、GUIツールキットについて改めて調査・練習してみた。作って納品して終わりではもったいないので、ちょっと書き残しておこうと思う。

先方から望まれている用件は、デモンストレーション用なのでそれなりに見栄えが良いこと、マイコンボードを叩くライブラリは既存のDLL or SOを使うこと、後々流用するかも知れないのでコードの可読性が高くメンテナンスが楽なこと。だと勝手に解釈。

普段CUIツールしか作らない人種が急にGUIを作ろうとすると、趣味に走りすぎて非常に手の込んだものを作ってしまう。ちなみに先達には、

  • WTL(Windows Template Library)でフォームを作りXMLパーサを自作した猛者
  • Cで書かれた既存の処理の上にPython on windowsで全体処理を書いた猛者、ちなみにGUIはpython-gtkで出している
とかが居る。perl with tck/tkとかruby with Qtとかも探すと居そうな気がする。ちゃんとメンテナンスできていれば問題ないんだけど。ちなみに私の最高駄作はc++とgtk (mm付かない)とgraphVizとapache XMLパーサを組み合わせたツール。ライブラリをダウンロードするサイトを間違えただけで動かなくなるという逸品には、足を洗って2年たった今も苦情が来たりする。

では、どういうツールキットを使えばメンテナンスが楽でLanguage binding絡みの問題が軽くて、あわよくばマルチOSを狙えるのだろうか。今ひとつよく分からないので、少し手を動かしてみることにした。今回はJava-SwingとQtについて扱ってみる。

とりあえず、既存ライブラリ(DLLとかSOとか既存のCコード)との親和性、開発環境、ウィジェットの種類、フォームデザイン、イベントハンドラあたりをまとめてみよう。

既存ライブラリとの親和性
Java-Swing:
JNI(Java Native Interface)機構を使えば、既存のライブラリやC/C++コードを扱うことができる。ミドルウェアをJava EEに移植するところや、Androidアプリの高速化とかで使われているらしい。手順は複雑。Java側のインターフェースになるクラスを設計し、javahツールでC++のヘッダを生成し、C++でラッピングライブラリを作成する。ネイティブ処理内でインスタンスを生成する場合に、どうやってjava側のインスタンスに関連付けるべきなのか良く分からない。
Qt:
基本的にC++の開発手法を踏襲。ライブラリも既存コードも何でも来いである。

開発環境
Java-Swing:
GUI部分に関しては、統合開発環境Eclipseを使うのが一番楽だろう。JNI部分に関しては、Java SDKのツールを直で叩く必要がある。また、C++でラッピング処理を書くために、gccが必要。例えばMinGWを使う。
Qt:
統合開発環境Qt Creatorを使う。コードアシスト、ヘルプがとても充実しており使いやすい。Qtのイベント処理はC++の規格外の文法を使っているので、qmakeというツールを通す必要がある。クラスの定義が変わった時には必ずqmakeを起動しよう、でないと、自動生成されたファイルが悪さをする。

ウィジェットの種類
Java-Swing:
基本的なものは大抵ある。足りないものはAWTのクラスを使うのかな?
Qt:
プリインストールされているものだけでもかなりある。貼り付けるだけでテキストエディタが作れるような高等なコンポーネントもある。開発元から追加でコンポーネントを入手できるらしい?ウィジェットの設定は非常に細かく、かゆいところに手が届きまくる。反面、どこのプロパティをいじればいいのか分からないことも多し。

フォームデザイン
Java-Swing:
JPanelクラスがウィジェットのコンテナとして機能する。JPanelクラスのsetLayoutメソッドでレイアウト系のクラスインスタンスを追加することで、BoxLayoutやGridLayoutなどを設定できる。 フォームデザインツールとして、サードパーティのNetbeansツールが使える。Eclipseにもフォームデザイナが有る?
Qt:
ウィジェット系クラスとLayout系クラスに完全に分かれている。ウィジェットをLayoutに追加し、Layoutをコンテナウィジェットにセットするという要領。
Qt Creatorにはフォームデザイナが備わっている。が、Layoutの入れ子を上手く作っていくことができずに諦めた。操作方法を覚えて再チャレンジしたいところ。

イベントハンドラ
Java-Swing:
イベント時の処理をActionListenerのサブクラスに記述する。ウィジェットのインスタンスに、ActionListenerのサブクラスをセットすると、ボタンをクリックした時などにイベント処理がスタートする。
Qt:
イベント処理は、シグナルとスロットと呼ばれる機構で実現する。シグナルがイベントスロー、スロットがコールバック関数に相当すると考えると分かりやすい。connect関数を使ってシグナルとスロットの接続関係を書く。シグナルはパラメータを持ち、スロットは引数をとる。スライドバーの位置とラベルの表示の同期など、ごく簡単な処理ならばconnect関数を書くだけでウィジェット間の連携を実現できる。

GUI以外のライブラリ
Java-Swing:
Javaの標準APIが使える。
Qt:
XMLパーサ、マルチスレッド処理、ソケット処理なども一緒に提供されている。

他のマシンでの実行
Java-Swing:
Javaが動けば問題なし。有る意味無敵。
Qt:
Qtのランタイムをインストールする必要がある。ランタイム込みでプロジェクトをエクスポートできるか不明。ランタイムだけバイナリでリリースしていたかどうかも不明。ちなみに開発環境は結構HDD容量を食う。

とりあえずここまで。総評も書きたいなぁ。余裕があったらコードを交えたメモを投下したり、他のツールキットを試した結果も載せてみたい。

posted by yuji_at_radiance at 23:21| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。