Qt

曖昧さ回避 この項目では、アプリケーションフレームワークについて説明しています。その他の用法については「QT」をご覧ください。
Qt
Qt designer を用いたGUI設計
開発元 トロールテック (1991–2008)
ノキア (2008–2011)
ディジア(英語版) (2012–2014)
Qt Project(英語版) (2011–現在)
The Qt Company(2014–現在)
初版 1992年 (32年前) (1992)
最新版 6.6.0 - 2023年10月10日 (5か月前) (2023-10-10)[1] [±]
最新評価版
6.0 Beta / 2020年10月20日 (3年前) (2020-10-20)[2]
リポジトリ
  • code.qt.io/cgit/qt/qtbase.git/
ウィキデータを編集
プログラミング
言語
C++
対応OS FreeBSD組み込みLinuxmacOSWindowsLinux(X11Wayland)、Windows CESymbianMeeGoAmiga OS、Android、iOS
プラットフォーム クロスプラットフォーム
サポート状況 開発中
種別 アプリケーションフレームワーク
ライセンス Qt Commercial License[3]
GPL 2.0 3.0[3]
LGPL 3.0[3]
公式サイト www.qt.io/jp
テンプレートを表示

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

性能

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

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

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

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

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

オープンソース版

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

設計

モジュール

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

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コントロールの描画を行うため、そのような問題に苦しめられることもなくなった[5]

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

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

シグナル&スロット

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

バインディング

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

詳細は「en:List of language bindings for Qt 4」および「en:List of language bindings for Qt 5」を参照

Qtによるhello world

#include <QtGui>

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

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

  1. Helloフォルダを作る
  2. 上のプログラムをHello.cppとしてHelloフォルダに保存する
  3. Helloフォルダで以下を実行
    1. qmake -project
    2. qmake
    3. make(または gmake や nmake 等。OSおよびコンパイラごとに異なる)
  4. 実行する ./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[7]も思ったほどの普及になっていない。これはChromiumの採用バージョンが最新よりかなり遅れることが原因である。

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


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

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

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

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

脚注

  1. ^ “Qt 6.6 Release”. Qt Blog (2023年10月10日). 2023年11月18日閲覧。
  2. ^ “Qt 6.0 Beta Released”. Qt Blog (2020年10月20日). 2020年10月25日閲覧。
  3. ^ a b c “Qt Licensing”. 2017年10月11日閲覧。
  4. ^ “All Modules”. Qt Project. 2017年10月12日閲覧。
  5. ^ “Library - Digia Plc”. 2013年11月1日時点のオリジナルよりアーカイブ。2017年10月12日閲覧。
  6. ^ Language Bindings - Qt Wiki
  7. ^ Qt WebBrowser | Qt WebBrowser Manual
  8. ^ Digia to acquire Qt from Nokia
  9. ^ http://blog.qt.nokia.com/2012/08/09/investment-in-qt-planned-to-continue-digia/
  10. ^ http://blog.qt.nokia.com/2012/08/09/digia-extends-its-commitment-to-qt-with-plans-to-acquire-full-qt-software-technology-and-business-from-nokia/

関連項目

ポータル FLOSS

外部リンク

ウィキメディア・コモンズには、Qtに関連するメディアおよびカテゴリがあります。
  • 組み込み&デスクトップ向けクロスプラットフォームソフトウェア開発|Qt 公式ウェブサイト
  • https://www.qt.io/ja-jp/blog Qt Blog (日本語ページ)
  • 日本 Qt ユーザー会
  • (代理店)SRAのQtサイト
  • (代理店)アイ・エス・ビーのQtサイト
Qt
技術
  • Meta-object System
  • Phonon
  • QML
  • QtScript(英語版)
  • Qt Quick(英語版)
  • Qt Style Sheets(英語版)
  • Signals and slots(英語版)
ツール
バインディング
  • PHP-Qt(英語版)
  • PyQt
  • PySide
  • QtRuby(英語版)
  • Qt Jambi(英語版)
関連項目
Software Compilation
ワークスペース
アプリケーション
開発
教育
  • Cantor
  • Kalzium
  • KGeography
  • KHangMan
  • Kig
  • Kiten
  • KmPlot
  • KStars
  • KTouch
  • KTurtle
  • Marble
  • Step
ゲーム
グラフィック
ネットワーク
マルチメディア
オフィス
システム
ユーティリティ
プラットフォーム
モジュール
コミュニティ
  • カテゴリ カテゴリ
  • コモンズ コモンズ
低レベル
高レベル
AmigaOS対応
  • BOOPSI(英語版)
  • Magic User Interface(英語版)
  • ReAction GUI(英語版)
  • Zune(英語版)
Mac OS/macOS対応
  • Cocoa (API)
  • MacApp(英語版)
  • MacZoop(英語版)
  • PowerPlant(英語版)
Windows対応
X11下のUnix対応
  • Athena/Xaw(英語版)
  • InterViews(英語版)
  • LessTif
  • Motif
言語別
クロスプラットフォーム
CLI
  • Gtk#
  • Moonlight(英語版)
  • Tao(英語版)
C/C++
  • CEGUI(英語版)
  • Component Library for Cross Platform
  • FLTK
  • FOX toolkit(英語版)
  • OpenGL User Interface Library(英語版)
  • GTK
  • Juce(英語版)
  • Qt
  • Wt(英語版)
  • Tk
  • TnFOX(英語版)
  • Ultimate++(英語版)
  • Visual Component Framework(英語版)
  • wxWidgets
  • YAAF(英語版)
  • XForms
  • XVT(英語版)
Objective-C
Flash
Java
デスクトップ
ウェブ
JavaScript
Common Lisp
Object Pascal
Perl
  • WxPerl(英語版)
  • Perl/Tk
PHP
  • PHP-GTK(英語版)
  • PHP-Qt(英語版)
  • WxPHP(英語版)
Python
Ruby
  • Shoes
  • QtRuby(英語版)
XML
  • Ample SDK(英語版)
  • CougarXML(英語版)
  • GladeXML
  • Lively Kernel(英語版)
  • Pyjamas(英語版)
  • Rialto Toolkit(英語版)
  • XAML
  • XML User Interface(英語版)
  • XUL
  • Wt(英語版)
  • 一覧記事一覧(英語版)
  • カテゴリカテゴリ