Qt

Qtとは、クロスプラットフォームアプリケーションフレームワークである。The Qt CompanyとQt Projectによって開発されている。

1. 性能
-----

「キューティー」と発音されることもあるが公式には「キュート」である。GUIツールキットとして広く知られているQtであるが、コンソールツールやサーバソフトウェアのような非GUIプログラムでも広く使用されている。

ライセンスには商用版とオープンソース版があり、現在のオープンソース版のライセンスはLGPLおよびGPLである。商用版を購入するとQt商用ライセンス  でソフトウェアを開発できる。LGPL版は、2009年3月にリリースされたQt 4.5から提供され始めた。これによりQtは営利企業にとってもより使いやすいライブラリとなった。

QtはC++で開発されており、単独のソースコードによりX Window System、Windows、macOS、組み込みシステムといった様々なプラットフォーム上で稼働するアプリケーションの開発が可能である。またコミュニティーにより多言語のバインディングが開発されており、JavaからQtを利用できるようにしたQt Jambi、さらにQtをRuby、Python、Perl、C#などから利用できるようにしたオープンソースのAPIが存在する。

このように開発が容易であり高速、スタイリッシュなQtはライセンスが多様なこともあり、KDEを始めとするオープンソースのアプリケーションに限らず、商業アプリケーションでの採用例も多く様々な分野で使用されている。

OpenGLやSVG、XMLといった最新技術にも対応している他、日本語を含む多バイト文字入力フレームワークへも対応している。

2. オープンソース版
-----------

GPLまたはLGPLが適用される。LGPLは、バージョン4.5から適用できる。Windowsや多くのUnix系オペレーティングシステム 、macOS向け、あるいはEmbedded Linux、Windows CE、Symbian向けにパッケージが配布されている。

3. 設計
-----

3.1. モジュール
----------

Qt 5のモジュール群の一部を以下に示す。

3.1.1. Qt Essentials
--------------------

Qt Core GUI向け以外のコアとなるクラスを保持する。
Qt Gui GUIのメインとなるクラスを保持する。OpenGLを含む。
Qt Multimedia 音楽、動画、ラジオ、カメラなどのマルチメディア機能を実装する。
Qt Multimedia Widgets マルチメディア機能を実現するウィジェット群。
Qt Network ネットワークプログラミングを簡単にするためのクラス群。
Qt QML QMLとJavaScriptに関するクラスを保持している。
Qt Quick カスタムユーザーインターフェイスを備えた高度に動的なアプリケーションを構築するためのフレームワーク。
Qt Quick Controls デスクトップ風のユーザーインターフェイスを作るためのQt QuickベースのUIコントロール群。
Qt Quick Dialogs Qt Quickアプリケーションにシステムダイアログを提供する。
Qt Quick Layouts ユーザーインターフェイスにQt Quick 2ベースのアイテムを使用するアイテムのレイアウト。
Qt SQL SQLを使うデータベースのためのクラス群。
Qt Test Qtアプリケーションとライブラリのユニットテストのためのクラス群。
Qt Widgets Qt GuiをC++ウィジェットで拡張するためのクラス群。

3.1.2. Qt Add-Ons
-----------------

Active Qt WindowsでActiveXやCOMを使うアプリケーションのためのクラス群。
Qt 3D 2Dや3Dレンダリングをサポートする近リアルタイムシミュレーションシステムのための機能。
Qt Android Extras Android固有の機能を使うためのAPI。
Qt Bluetooth Bluetoothハードウェアへのアクセスを提供する。
Qt Canvas 3D JavaScriptを使ったQt QuickアプリケーションからOpenGL風の3D描画を可能にする。
Qt Concurrent 低レベルな操作なしにマルチスレッドプログラムを書くためのクラス群。
Qt D-Bus D-Busプロトコルを使用したプロセス間通信のためのクラス群。
Qt Gamepad Qtアプリケーションのゲームパッドハードウェアのサポートを可能にする。
Qt Graphical Effects Qt Quick 2で使うためのグラフィカルエフェクト。
Qt Image Formats Qt Guiでサポートされていない画像フォーマットのためのプラグイン群。
Qt Location QMLアプリケーションで地図の表示や道案内やコンテンツの配置をする。
Qt Mac Extras macOS固有の機能を使うためのAPI。
Qt NFC NFCハードウェアへのアクセスを提供する。
Qt Positioning スマートフォンなどで位置情報を提供する。
Qt Print Support 印刷を簡単にするためのクラス群。
Qt Purchasing Qtアプリケーションのアプリ内課金を可能にする。
Qt Sensors センサーハードウェアへのアクセスとモーションジェスチャーの認識を提供する。
Qt Serial Port ハードウェアと仮想シリアルポートへのアクセスを提供する。
Qt SVG SVGファイルの内容を表示するクラスを保持する。SVG 1.2 Tinyの機能をサポートする。
Qt WebEngine アプリケーションにウェブコンテンツを埋め込むためのクラスと関数群。
Qt WebView QMLアプリケーションでウェブコンテンツをプラットフォームのネイティブAPIを使い、アプリケーションに完全なウェブレンダリングエンジンを含むことなく表示する。
Qt Windows Extras Windows固有の機能を使うためのAPI。
Qt X11 Extras X11固有の機能を使うためのAPI。
Qt XML SAXおよびDOMインターフェイスを実装。

3.2. ネイティブUI描画APIの使用
--------------------

かつてQtはプラットフォームのネイティブの見た目をエミュレートしていたため、ときどきエミュレーションが不完全な場合に微妙な不一致が発生することもあったが、最近のバージョンのQtはそれぞれのプラットフォームのネイティブAPIでQtコントロールの描画を行うため、そのような問題に苦しめられることもなくなった。

3.3. メタオブジェクトコンパイラ
------------------

mocと呼ばれるメタオブジェクトコンパイラは、Qtプログラムのソースコードを入力として実行されるツールである。C++のソースコードにマクロを1、2行記述するだけで、mocがそれを解釈しプログラムで使用されるクラスについての「メタ情報」とともに追加のC++コードを挿入して出力する。このシステムにより、ネイティブのC++では利用できなかったり実現しようとすると煩雑なシグナル&スロットシステムやメタプログラミング、非同期関数呼び出しなどを簡単に利用できる。

3.4. シグナル&スロット
--------------

オブジェクト間でコミュニケーションする時にObserver パターンを簡単に使えるようにするための仕組み。あるオブジェクトがシグナルを発信するとそのシグナルに接続してあるオブジェクトのスロットが呼ばれる。発信側は受信側を知る必要がなく、インクルード関係をシンプルに保つことができる。

3.5. バインディング
------------

Qtはさまざまな言語用のバインディングを持っており、機能セットの一部または全部を実装している。

3.6. Qtによるhello world
---------------------

include int main { QApplication app; QLabel label; label.show; return app.exec; }<WtXmlEndTag />

3.7. Qt hello world プログラムのコンパイルおよび実行
------------------------------------

Helloフォルダを作る
上のプログラムをHello.cppとしてHelloフォルダに保存する
Helloフォルダで以下を実行
qmake -project
qmake
make
実行する ./release/Hello 

4. 開発環境・デザインツールなど
-----------------

クロスプラットフォームの統合開発環境Qt Creator、GUI エディタのQt Designer、翻訳支援ツールのQt Linguist、リファレンスドキュメントビューアのQt Assistant等の開発支援ツールが付属しており、これらを使用することで高速な開発が可能となっている。その他のものとしてWindowsのVisual Studioでの開発を可能にするプラグインVisual Studio Add-inが用意されている。またEclipse上で開発を可能にするQt Eclipse Integrationも用意されている。また、Unix/X11では、KDevelopが使用できる。

Qt/UNIX上ではGCC、Qt/WindowsではMicrosoft Visual Studio上のコンパイラが使える他、MinGW等のコンパイラでの開発も可能である。

5. 歴史
-----

Quasar Technologies社のHaavard NordとEirik Chambe-Engは、1991年にQtの開発をはじめた。

Qtと名づけられたのは、Qという文字がHaavardの使っていたEmacsのフォントの中でもっとも美しく見えたという理由からである。tはtoolkitの略語である。

KDEがLinuxで主要なデスクトップ環境になることが明確になった1998年頃、KDEがQtベースで開発されていることから、フリーソフトウェアであるKDEがライセンス上、Trolltech社のQPLに抵触する可能性が懸念された。

背景は以下の通りである。

まずバージョン1.45まではQtのソースコードは、FreeQt licenseでリリースされていた。しかしバージョン2.0からは、このライセンスはQ Public License  に変更された。Free Software Foundationによると、QPLはGPLとは矛盾するライセンスであった。この問題はKDE側とTrolltech社との間で協議されることになり、結果、KDE Free Qt Foundationが発足されることになった。結果、QtはQPLとGPLのデュアルライセンスで配布されることが決まり、この問題は完全に解決した。さらに、将来、Trolltechが何らかの理由で新しいオープンソース版を作成することができなくなった場合でも、KDE Free Qt FoundationによりQtの開発を続けることが保証されることになった。

最初の二つのバージョンでは、プラットフォームはUNIX及びWindowsプラットホームがサポートされた。当初はQt/X11上でのプロプライエタリライセンスはWindowsプラットホームでは使用できず、WindowsでQtを使用するときはQPLエディションのQtを購入する必要があった。

2001年の終わりにTrolltech社はバージョン3.0をリリースした。バージョン3.0からはMac OS Xプラットフォームもサポート対象となった。Mac OS X上ではGPLで配布されている。

2005年6月にTrolltech社はQtバージョン4をリリースした。Qt4では Windows上でも、QtをGPLでソースコードを公開することになった。これにより、Windows、Mac OS、Unixの全てのプラットフォームでGPLのフリーオープンソースアプリケーションが開発できるようになった。またこのバージョンからコア、GUI、ネットワーク、XML、OpenGLなど、機能別にモジュールが分割された。不要な機能は読み込まれないため、メモリの節約になる。その一方、Qt4はQt2および3とソースコードに互換性がない。このため現在date=2018年8月}}でもQt3を使い続けるユーザーは多い。またKDEは3から4へバージョンアップする際、ソースコードの全面的な書き直しが必要となったためリリースが大幅に遅れた。

2009年3月にLGPLが適用となるバージョン4.5が発表された。これはTrolltech社がノキアに買収されたことにともなうもので、組み込み実績の多いQtをプロプライエタリソフトウェアでもより使用しやすくするためである。バージョン4.5においても、Qtの商用ライセンスは存続し、LGPLですら許容できない場合は商用ライセンスを使用する必要がある。

2009年5月には、Gitリポジトリが公開され、ユーザからのパッチのコミットがより簡易になった。

なお、初期のバージョンにおいては日本語固有の処理にバグがあり、ライセンス上それを修正し配付することが困難であったため、QtおよびKDEの普及が日本語圏において遅れることとなった。この問題はTrolltech社が日本語パッチを特別に認めることにより解決した。

Chromiumを援用することがQt5.6で決まったものの、その性能の悪さからすぐに批判され、現在date=2018年8月}}ではQtWebEngineとQtWebKitが混在している。Qt WebBrowserも思ったほどの普及になっていない。これはChromiumの採用バージョンが最新よりかなり遅れることが原因である。

2012年8月9日にディジアがノキアからQtを買収した。AndroidやiOS、Windows 8へのQtの早急な対応を目標に、約125人のQt開発者たちがディジアに移籍された。また、このころBSD向け軽量デスクトップ環境・Luminaの開発がはじまった。

6. Qtを使用している主なソフトウェア
--------------------

Autodesk Maya 2011以降 - 3DCGソフトウェア
Avidemux - 動画編集ソフトウェア
FreeCAD - CADソフトウェア
Google Earth - 仮想地球ソフトウェア
KDE - デスクトップ環境
Lumina - 軽量デスクトップ環境
Musedate=2022年12月}} - シーケンサ
MuseScore - 楽譜作成ソフトウェア
Nuke - デジタル合成ソフト
ParaView - データ可視化ソフト
QGIS - GISソフト
Rosegarden - DAWソフトウェア
Skype - コミュニケーションソフト
Stellarium - 3Dプラネタリウムソフト
モバイルWnn - 日本語入力システム
QMP3Gain - mp3音量均一化ソフト
[1] - リモートデスクトップソフト
VLC - クロスプラットフォームのメディアプレイヤー。

7. Qtを利用できるプログラミング言語
--------------------

QtはGUIツールキットとして広く使われているため、メイン開発言語であるC++以外の多数のプログラミング言語バインディングが存在する。

node-qt - Node.jsバインディング
PyQt - 古くから使われているPythonバインディング。GPL。
PySide - ノキアが開発したPythonバインディング。LGPL。
QtRuby - Rubyバインディング
RingQt - Ring用のQt バインディングと Ring 向けの Qt 関連のフォームデザイナ、ツールが処理系に標準添付されている。

8. 脚注
-----

9. 関連項目
-------

ウィジェット・ツールキット

10. 外部リンク
---------

[2] 公式ウェブサイト
https://www.qt.io/ja-jp/blog Qt Blog (日本語ページ）