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はさまざまな言語用のバインディングを持っており、機能セットの一部または全部を実装している。 #include <QtGui> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("Hello, world!"); label.show(); return app.exec(); } 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の開発がはじまった。 Autodesk Maya 2011以降 - 3DCGソフトウェア Avidemux - 動画編集ソフトウェア FreeCAD - CADソフトウェア Google Earth - 仮想地球ソフトウェア KDE - デスクトップ環境 Lumina - 軽量デスクトップ環境 Muse[要曖昧さ回避] - シーケンサ[要出典] MuseScore - 楽譜作成ソフトウェア Nuke - デジタル合成ソフト ParaView - データ可視化ソフト QGIS - GISソフト Rosegarden - DAWソフトウェア Skype - コミュニケーションソフト Stellarium - 3Dプラネタリウムソフト モバイルWnn - 日本語入力システム QMP3Gain - mp3音量均一化ソフト Qt Brynhildr - リモートデスクトップソフト VLC - クロスプラットフォームのメディアプレイヤー。 QtはGUIツールキットとして広く使われているため、メイン開発言語であるC++以外の多数のプログラミング言語バインディングが存在する。 node-qt - Node.jsバインディング PyQt - 古くから使われているPythonバインディング。GPL。 PySide - ノキアが開発したPythonバインディング。LGPL。 QtRuby - Rubyバインディング RingQt - Ring用のQt バインディングと Ring 向けの Qt 関連のフォームデザイナ、ツールが処理系に標準添付されている。