Qt
Qt(キュート)とは、クロスプラットフォームアプリケーションフレームワークである。The Qt CompanyとQt Projectによって開発されている。
「キューティー」と発音されることもあるが公式には「キュート」である。GUIツールキットとして広く知られているQtであるが、コンソールツールやサーバソフトウェアのような非GUIプログラムでも広く使用されている。
ライセンスには商用版とオープンソース版があり、現在のオープンソース版のライセンスはLGPLおよびGPLである。商用版を購入するとQt商用ライセンス (Qt Commercial License) でソフトウェアを開発できる。LGPL版は、2009年3月にリリースされたQt 4.5から提供され始めた。これによりQtは営利企業にとってもより使いやすいライブラリとなった。
QtはC++で開発されており、単独のソースコードによりX Window System(Linux、UNIX等)、Windows、macOS、組み込みシステムといった様々なプラットフォーム上で稼働するアプリケーションの開発が可能である。またコミュニティーにより多言語のバインディングが開発されており、JavaからQtを利用できるようにしたQt Jambi、さらにQtをRuby、Python、Perl、C#などから利用できるようにしたオープンソースのAPIが存在する。
このように開発が容易であり高速、スタイリッシュなQtはライセンスが多様なこともあり、KDEを始めとするオープンソースのアプリケーションに限らず、商業アプリケーションでの採用例も多く様々な分野で使用されている。
OpenGLやSVG、XMLといった最新技術にも対応している他、日本語を含む多バイト文字入力フレームワークへも対応している。
GPLまたはLGPLが適用される。LGPLは、バージョン4.5から適用できる。Windowsや多くのUnix系オペレーティングシステム (OS)、macOS向け、あるいはEmbedded Linux、Windows CE、Symbian(Qt4.6より)向けにパッケージが配布されている。
Qt 5のモジュール群の一部を以下に示す。
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++ウィジェットで拡張するためのクラス群。
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インターフェイスを実装。
かつてQtはプラットフォームのネイティブの見た目をエミュレートしていたため、ときどきエミュレーションが不完全な場合に微妙な不一致が発生することもあったが、最近のバージョンのQtはそれぞれのプラットフォームのネイティブAPIでQtコントロールの描画を行うため、そのような問題に苦しめられることもなくなった。
mocと呼ばれるメタオブジェクトコンパイラは、Qtプログラムのソースコードを入力として実行されるツールである。C++のソースコードにマクロを1、2行記述するだけで、mocがそれを解釈しプログラムで使用されるクラスについての「メタ情報」とともに追加のC++コードを挿入して出力する。このシステムにより、ネイティブのC++では利用できなかったり実現しようとすると煩雑なシグナル&スロットシステムやメタプログラミング、非同期関数呼び出しなどを簡単に利用できる。
オブジェクト間でコミュニケーションする時にObserver パターンを簡単に使えるようにするための仕組み。あるオブジェクトがシグナルを発信するとそのシグナルに接続してあるオブジェクトのスロット(関数)が呼ばれる。発信側は受信側を知る必要がなく、インクルード関係をシンプルに保つことができる。
Qtはさまざまな言語用のバインディングを持っており、機能セットの一部または全部を実装している。
上のプログラムをHello.cppとしてHelloフォルダに保存する
qmake -project
make(または gmake や nmake 等。OSおよびコンパイラごとに異なる)
実行する ./release/Hello (Windowsなら release\Hello.exe)
クロスプラットフォームの統合開発環境Qt Creator、GUI エディタのQt Designer、翻訳支援ツールのQt Linguist、リファレンスドキュメントビューアのQt Assistant等の開発支援ツールが付属しており、これらを使用することで高速な開発が可能となっている。その他のものとしてWindowsのVisual Studioでの開発を可能にするプラグインVisual Studio Add-inが用意されている。またEclipse上で開発を可能にするQt Eclipse Integrationも用意されている。また、Unix/X11(Linuxなど)では、KDevelopが使用できる。
Qt/UNIX上ではGCC、Qt/WindowsではMicrosoft Visual Studio上のコンパイラが使える他、MinGW等のコンパイラでの開発も可能である。
Quasar Technologies社のHaavard NordとEirik Chambe-Eng(Qtの開発者であり、現在2018年8月TrolltechのCEO、および社長)は、1991年にQtの開発をはじめた(Quasar Technologies社はその後Troll Tech社、Trolltech社へと社名を変更していく)。
Qtと名づけられたのは、Qという文字がHaavardの使っていたEmacsのフォントの中でもっとも美しく見えたという理由からである。tはtoolkitの略語である。
KDEがLinuxで主要なデスクトップ環境になることが明確になった1998年頃、KDEがQtベースで開発されていることから、フリーソフトウェアであるKDEがライセンス上、Trolltech社のQPLに抵触する可能性が懸念された。
背景は以下の通りである。
まずバージョン1.45まではQtのソースコードは、FreeQt licenseでリリースされていた。しかしバージョン2.0からは、このライセンスはQ Public License (QPL) に変更された。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とソースコードに互換性がない。このため現在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で決まったものの、その性能の悪さからすぐに批判され、現在2018年8月ではQtWebEngineとQtWebKitが混在している。Qt WebBrowserも思ったほどの普及になっていない。これはChromiumの採用バージョンが最新よりかなり遅れることが原因である。
2012年8月9日にディジアがノキアからQtを買収した。AndroidやiOS、Windows 8へのQtの早急な対応を目標に、約125人のQt開発者たちがディジアに移籍された。また、このころBSD(BSDの子孫)向け軽量デスクトップ環境・Luminaの開発がはじまった。
FreeCAD - CADソフトウェア
Google Earth - 仮想地球ソフトウェア
Lumina - 軽量デスクトップ環境
Muse - シーケンサ
Nuke - デジタル合成ソフト
ParaView - データ可視化ソフト
QGIS - GISソフト
Rosegarden - DAWソフトウェア
Skype - コミュニケーションソフト
Stellarium - 3Dプラネタリウムソフト
モバイルWnn - 日本語入力システム
QMP3Gain - mp3音量均一化ソフト
- リモートデスクトップソフト
VLC - クロスプラットフォームのメディアプレイヤー。
QtはGUIツールキットとして広く使われているため、メイン開発言語であるC++以外の多数のプログラミング言語バインディングが存在する。
node-qt - Node.jsバインディング
PyQt - 古くから使われているPythonバインディング。GPL。
PySide - ノキアが開発したPythonバインディング。LGPL。
QtRuby - Rubyバインディング
RingQt - Ring用のQt バインディングと Ring 向けの Qt 関連のフォームデザイナ、ツールが処理系に標準添付されている。