Qt

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

## 性能
「キューティー」と発音されることもあるが公式には「キュート」である。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 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++ウィジェットで拡張するためのクラス群。

#### 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インターフェイスを実装。

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

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

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

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

### Qtによるhello world

```cpp
#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("Hello, world!");
    label.show();
    return app.exec();
}
```


### Qt hello world プログラムのコンパイルおよび実行
# Helloフォルダを作る
# 上のプログラムをHello.cppとしてHelloフォルダに保存する
# Helloフォルダで以下を実行
## qmake -project
## qmake
## 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の開発者であり、現在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とソースコードに互換性がない。このため現在でもQt3を使い続けるユーザーは多い。またKDEは3から4へバージョンアップする際、ソースコードの全面的な書き直しが必要となったためリリースが大幅に遅れた。

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

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

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

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

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

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

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

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

## 脚注



## 関連項目

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

## 外部リンク

* 組み込み＆デスクトップ向けクロスプラットフォームソフトウェア開発｜Qt 公式ウェブサイト
* https://www.qt.io/ja-jp/blog Qt Blog (日本語ページ）
* 日本 Qt ユーザー会
* （代理店）SRAのQtサイト
* （代理店）アイ・エス・ビーのQtサイト