Ubuntu Weekly Recipe

第284回クロスプラットフォームなアプリケーション開発フレームワークQtでプログラミングをはじめる

第276回 Ubuntuオフラインミーティング2013.05 Tokyo――IT屋ではない人からみた体験レポートよりバトンを渡されてから大変遅くなってしまいました。今回は幅広く使われているアプリケーション開発フレームワークのQtについて紹介します。また、UbuntuにおいてのQtも紹介します。

Qtとは

Qt(キュート)とは、プログラミング言語C++で書かれたクロスプラットフォームな開発フレームワーク[1]です。たとえば仮想化ソフトのVirtualBoxは、Linux・Windows・Macで動作します。これには扱いやすいフロントエンドGUIがありますが、これはQtで作られています[2]⁠。また、扱いやすいQtCreatorというIDEで快適にプログラミングをすることができます。

図1 QtCreator
図1 QtCreator

次のような特徴があるため、プログラミング初心者から上級者までお勧めできるフレームワークです。

特徴

クロスプラットフォーム

アプリケーションを動かす環境は、パソコンだけでもUNIX系OS・Windows・Macなどがありますし、カーナビなどいわゆる組込み機器などがあります。いずれも、ディスプレイへの表示や文字入力など多くの仕組みが異なります。そこで、移植性の良いプログラミングをするには抽象化された仕組みが必要になります。Qtはこれを提供しています。

非常に膨大で多様なライブラリ

アプリケーションを開発する際には、様々なライブラリを用意しなければならないことが多いです。たとえば、データベースにアクセスしたりときにはWebページをロードしたりしなければいけないこともあるかもしれません。Qtは非常に膨大な機能を提供しているため、Qtだけで必要充分なアプリケーションを作ることが可能です。その豊富なライブラリを他の言語でも使えるようにとオープンソースな多数のバインディングが存在します。

C++以外にもQMLと呼ばれるJavaScriptライクな言語が用意されている

Qtを使った開発には言語としては基本的にC++を使います。しかし、近年求められるユーザエクスペリエンスの高い、いわゆるアニメーション効果や3D効果があるユーザインターフェースの作成については、必ずしも最適とは言えませんでした。また、これらを実現するためにはOpenGL/ESなどのテクノロジーを利用する必要性がありますが、これには専門性が求められるため敷居が高い分野でした。

QML(Qt Meta-object Language)はこれらを解決する方法として考案され、実装されています。QMLはJavaScriptをベースに作成された言語で、C++が苦手とするUIの記述などが比較的に簡単にできるようになっています。

開発はオープンに行われている

もともとQtはノルウェーのTrolltech社によって作られたGUIツールキットで、その後Nokia社に移り現在はDigia社が商用サポートなどを行なっています。Nokia社の時代にQtをよりオープンにするプロジェクトが発足し、現在はqt-projectという形で開発しています。そのため、メーリングリスト・バグトラッキングシステム・フォーラム・IRCが整備されておりQt(ライブラリ)側に問題があった際でも、いわゆるオープンソースのやり方でこれを解決していくことが可能です。詳しくは次のURLを参考にしてください。

http://qt-project.org/contribute

http://blog.qt.digia.com/jp/2011/09/14/qt-project/

バージョンについて

Qtには現在、Qt4.8とQt5の2つのバージョンがあります。

Qt4.8は2005年にリリースされたQt4.0から順当にアップデートされてきた、4.0系最後のバージョンです。最初のリリースから8年以上経つ枯れた環境です。今あるQtのアプリケーションはほぼ4.0系と考えてよいでしょう。

Qt5はQtQuick2という目玉機能を搭載し2012年にリリースされたバージョンです。かなり久しぶりのメジャーバージョンアップということになります。その他にも、Qt Platform Abstraction(QPA)と呼ばれる描画のバックエンドをより効率的に開発するための仕組みなどが導入されたり、WebKit2が採用されたりしています。

今日のWebブームの火付け役とも言えるGoogle Mapは2005年頃、スマートフォンやタブレットの代表であるiPhoneやAndroidが出てきたのが2008年頃だと考えると、Qt4が設計された時と今はだいぶ取り巻く環境が違うということが実感できると思います。Qt5はQt4の強みをそのままにイマドキのデバイスやテクノロジーに対応できるように再設計された待望のバージョンと言えるでしょう。 詳しくはIntroducing Qt5のページを参照してください。

QMLを使ったプログラミングについてですが、Qt4でも、QtQuick1を使ってプログラミングが可能です。しかし、QtQuick2が存在する今はこれが含まれるQt5を利用することを推奨します。

まとめると、既存のアプリケーションについてはQt4で開発を行い、新規にプロジェクトを起こす場合やQMLを使ったアプリケーションを作りたい場合はQt5を選択すると良いでしょう。

ライセンスについて

LGPLv2.1とDigia社がライセンスしているコマーシャルライセンスの2つがあります。よって、Qtを用いて作成したアプリケーションは必ずしもソースコードを公開する必要はありません。詳しくは、ライセンスのページを参考にしてください。それぞれの機能差などは比較のページを参照してください。

UbuntuとQt

Qtは前述のような特徴があるため、非常に多くのアプリケーションで利用されており、最も人気のある開発フレームワークの1つと言っても良いでしょう。GNOMEと人気を二分していると言われているLinuxデスクトップ環境のKDEはQtで作成されていますし、SkypeやVirtualBoxなどでも利用されています。

Ubuntu特有の部分としては、⁠12.10で廃止されてしまいましたが)Unity 2DやUbuntu TVのプロトタイプで使われていたりしました。Ubuntu 11.04ではそれまで別途に導入する必要があった実行のためのQtライブラリがインストールした段階で導入済みになるなど、利用の面でも利便性が高まっていますUbuntu Weekly Topics 2011年1月21日号 QtとUbuntu・Unity 2D・新しいXスタック・UWN#219・Ubuntu Server Survey 2011⁠。

また、次世代版として開発されているUnity 8(旧称:Unity Next)はQt5+QMLで作成されているなど、Ubuntuの中でも重要な要素となっています。詳細についてはUnityNextSpecを参照すると位置付けがよくわかるでしょう。

Unityという単語は「統一・統合」という意味の名詞です。UnityはUbuntu(パソコン⁠⁠、Ubuntu Touch(ハンドセットやタブレット⁠⁠、Ubuntu TV(組込み)とあらゆるところで使われ、文字通り統一的な操作性を提供してくれることでしょう。これを実現するには技術的なポイントとしてクロスプラットフォームが考慮されたライブラリが必須であり、Qtはまさにそこにハマるテクノロジーなのです。

UbuntuでQt開発をはじめよう

Qtはアプリケーション開発をするためのフレームワークですので、さっそく何か作ってみましょう。

環境構築

アプリケーションを組む上で大変な作業の1つとして、環境の準備があります。必要なライブラリを調査・用意してそれらにパスを通すなどです。もっとも、UbuntuはDebian由来のパッケージングシステムがありますのでそれほど大変ではありません。Qtをはじめる場合はqt-sdkメタパッケージをインストールするのが最短です。

筆者はUbuntu 13.04の環境で作業を行いました。端末で次のコマンドを実行するか、ソフトウェアセンターで⁠qt-sdk⁠と検索します。

$ sudo apt-get install qt-sdk

13.04にはUIの翻訳が反映されないというバグが存在するため、ワークアラウンドとして次のコマンドを実行します。

$ sudo ln -s /usr/share/qt4/translations/ /usr/share/qt5/translations

導入されるパッケージは多数に及びますが、いくつか抜粋しますと次のようなものがインストールされます。

build-essential

コンパイラ(gcc、g++)やmakeなどビルドするのに必要なものが揃ったメタパッケージです。

libqt4-dev

Qt4の開発用ライブラリなどのメタパッケージです。Ubuntuの場合は、12.10まではQt4の環境が、13.04からはQt4とQt5の環境が導入されます。Ubuntu 12.04 LTSを使っている場合は、Ubuntu SDKのPPAを追加しておくことで、Qt5を導入することが可能です。

qt5-default

このメタパッケージにより、Qt5が導入されます。このパッケージはUbuntu 13.04から用意されています。

qtcreator

QtCreatorとは、Qtで作られたC、C++向けのIDEです。とても軽快に動作し、補完機能、各種ドキュメントへのアクセス、デバッガとの連携、バージョン管理ソフトウェアとの連携など他のIDEと比較しても遜色がありません。Qt自体はC++のライブラリなので、コンソールで使い慣れたエディタを利用して開発していく事も充分に可能ですが、やはり専用の環境は利便性が高いです。何より準備が楽ちんです。

HelloWorld

GUIツールキットなので、GUIなHelloWorldを作成したいと思います。今回はC++を使って開発します。

それではさっそく、IDEのQtCreatorを立ち上げましょう。Windowsキー(Superキー)を押してDashを開き、⁠QtCreator⁠と入力して起動します。プログラムの作成を始めるにはプロジェクトを作成します。⁠ファイル][ファイル/プロジェクトの新規作成]をクリックします。プロジェクトの中からアプリケーションを選択し、⁠Qt GUI アプリケーション]を選択して、選択をクリックします。プロジェクト名を適当に付けます。ここでは⁠HelloQtWorld⁠としました。あとは、とりあえずデフォルトのままでNextをクリックしていきます。すると、図2のようにひな形ができあがります。

図2 編集モード
図2 編集モード

次に、プロジェクトからフォームをクリックし、⁠mainwindow.ui」をダブルクリックします。すると、UI編集画面になります。左にウィジェット、真ん中に画面、右にプロパティリストなどが並んでいます。今回はDisplayWidgetsのLabelを使います。ウィジェットを掴んで画面にドロップします。これで配置は完了します。

図3 デザインモード
図3 デザインモード

設置したLabelウィジェットをダブルクリックして⁠HelloQtWorld⁠と入力しましょう。そして、左下にある再生マークの形をしているRunボタンをクリックしてみましょう。ビルドを開始するので、未保存のソースがあるとダイアログが出てきます。すべて保存をクリックします。どうでしょうか、うまく表示されましたか? 確認できたら、終了の×ボタンをクリックして終了します。

図4 実行結果
図4 実行結果

ビルド・実行などが失敗した場合は、コンパイラの出力結果などを確認する必要があります。QtCreatorのアウトプットペインと呼ばれるボタンを押すことで該当の出力を確認できます。

図5 アウトプットペイン
図5 アウトプットペイン

一連の流れがどうなっているのかソースコードを確認しましょう。ソースコードのmain.cppを開きます。QApplicationクラスは画面やマウスカーソルなどQtアプリケーションに関するリソースなどを管理しているものです。MainWindowクラスはmainwindow.cppに定義されているクラスです。そちらを開いてみると、QMainWindowクラスを継承したクラスだということがわかります。つまり、ウインドウを作成したい場合はQMainWindowクラスを継承したクラスを作成すればよいということです。

最後にウインドを可視状態にして、execを行います。QApplicationはメインイベントループとなります。GUIアプリケーションの場合はキーボードやクリックなどのイベントを監視して処理を行います。そのため、単純にreturnが実行されて終了することはありません。

ところで、実行結果を見るとWindowのタイトルがMainWindowになっていることに気付きます。これを変えてみましょう。編集モードからMain.cppを開いて、MainWindow w;の行の下に次の一行を追加します。

w.setWindowsTitle("HelloQtWindow");

ドットを入力したタイミングで候補リストが出てくると思います。ぜひ、コピー&ペーストをするのではなくタイピングして試してみてください。また、メンバ関数の情報などはカーソルを合わせてF1キーを押すことでドキュメントに飛ぶことができます[3]⁠。Runボタンを押して実行結果がどう変わるか確認しましょう。

QMLを使ったHelloWorldを作成してみたい場合は、Ubuntu-SDKのget-startedが参考になるでしょう。

Qtを学ぶには

QtはC++なので、C++の基本を学ぶべきでしょう。使い方は機能が広範囲かつ膨大なので基本的には公式ドキュメントを参照するのが良いでしょう。日本語の書籍もいくつかあります。英語にはなりますがまずはGetting Started with Qtを一通り眺めるのが良いです。Qtは歴史が長いこともあり、多数の情報がネット上にありますが、すでに古くなってしまっていることもある点に注意してください。

前述で述べたQt5の特徴であるQMLについてはSoftware Designのバックナンバー2013年1月号の記事が参考になるでしょう。また、2013年8月2日にはアスキー・メディアワークスさんから「Qt QuickではじめるクロスプラットフォームUIプログラミング」販売される予定です。著者は共に、Qt Ambassador[4]の折戸さんです。

謝辞

Qt勉強会の皆さまにご助言を頂きました。ありがとうございました。

おすすめ記事

記事・ニュース一覧