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

ウィジェット・ツールキット  あるいは GUIツールキット とは、グラフィカルユーザインタフェース  を構成する部品の集合である。通常、ライブラリやアプリケーションフレームワークの形式で実装される。分野によって、ウィジェットはコントロールあるいはコンポーネントとも呼ばれる。GUIを利用したデスクトップアプリケーションやモバイルアプリケーションといった、アプリケーションソフトウェアの作成に用いられる。

個々の部品についてはウィジェット を参照されたい。

1. 概要
-----

高レベルなウィジェット・ツールキットは、GUIの生成と振る舞いを管理するAPIである。

GUIは、ウィジェットの木構造として生成されることが多く、その一部がユーザーとのやり取りが可能となっていて、他はウィジェットをグループ化するコンテナである。
ウィジェットの木構造の中身やウィジェットの属性は、実行時に変更可能であるものが多い。
ツールキットはボタンをクリックするなどのユーザーイベントを扱う。イベント検出後のアクションはツールキットが指定するものではなく、アプリケーションが指定する。例えば、ファイルダイアログからユーザーがファイルを選択したら、ファイルダイアログ・ウィジェット自身の反応とそのユーザーイベントの検出はウィジェット・ツールキットが扱うが、ファイルを選択したことに対応する具体的なアクションはアプリケーション自身が行う。ウィジェット・ツールキットは、コンテナの中でのウィジェットの位置決めの手段を必ず持っている。最も簡単な方法は、画面上の絶対座標や上位ウィジェットからの相対座標をピクセル単位で指定する方法だが、ウィジェット同士の相対的な位置関係だけを指定して具体的な座標を指定しない方法もある。多くのツールキットは、統合開発環境と連携した視覚的なGUIデザイナーをサポートし、直感的なGUI部品の配置およびプレビューを使用したプロトタイピング  も可能となっている。

GUI部品の配置や各種プロパティの設定は、ロジックを記述するためのプログラミング言語によって直接ソースファイルに記述する方法のほか、独自のリソーススクリプトやXMLなどの形式で、ロジックを記述するソースファイルとは別のファイルに分けて記述することのできる機能をサポートするツールキットもある。レイアウト定義を別ファイルに分離することで、直感的なプレビューやプロトタイピングを可能にするデザイン補助ツールを開発しやすくなるなどのメリットがあるが、複数のファイルにUIの記述が分散することで、逆に実装が複雑化してしまったりするデメリットもある。プログラマーが手作業で編集せずに、デザイン補助ツールを経由して操作することで自動生成されたレイアウト定義ファイルのコードは、バージョン管理ツールなどを用いて複数人でソースコードを共有して開発する際にコンフリクトの解消が難しくなることもある。

ウィジェットのルック・アンド・フィールはツールキット内でハードコードされる場合もあるが、ウィジェット・ツールキットによってはユーザーがルック・アンド・フィールを定義できるAPIを提供している。

GUIアプリケーションの開発効率やメンテナンス性を向上するために、Model-View-Controller  やModel-View-ViewModel  といった設計パターンが使用されることもある。ツールキットが標準的にこれらの設計パターンをサポートしていることもある。MVVMに関してはデータバインディング機能のサポートが前提となる。

2. 主要なウィジェット・ツールキット
-------------------

2.1. 低レベルなもの
------------

2.1.1. オペレーティングシステムに組み込まれているもの
------------------------------

Classic Mac OSのツールボックス、あるいは従来はROMに組み込まれていたMacintoshのAPI。Mac OS Xでの改良版はCarbon。
Windowsで使われているWindows API。描画機能をつかさどるGraphics Device Interface  と呼ばれる下位レベルレイヤーの上に、ウィンドウシステムをつかさどる上位レベルレイヤーが構築されている。主にC言語形式関数群あるいはCOMコンポーネントの形で公開・提供される。
AndroidのActivity/View

2.1.2. オペレーティングシステム上の分離した層として実装されているもの
--------------------------------------

X Window Systemは基本的な構成要素  を含んでおり、Motifはそれを使っているが、GTKやQtなど大部分のツールキットはこれを使わず、直接Xlibを使っている。
AmigaOSのIntuitionは、AmigaのROMに含まれていて、やや高レベルなウィジェットを使いAmigaのGUIであるWorkbenchを呼び出している。Amiga OS 2.0のIntuitionからはディスク上のオブジェクト指向ライブラリとなった。同時にWorkbenchもIconもディスクベースとなっている。

2.2. 高レベルなもの
------------

2.2.1. macOS
------------

Cocoa - macOSのアプリ開発で使用される。UIフレームワークとしてAppKitを含む。
MacApp - Macintosh  フレームワーク。
MacZoop - Macintosh C++フレームワーク。
PowerPlant - Macintoshフレームワーク。
SwiftUI - Swiftのみを使用してUIを宣言的に記述できるフレームワーク。

2.2.2. iOS
----------

Cocoa Touch - iOS/iPadOS/tvOS/watchOSのアプリ開発で使用される。UIフレームワークとしてUIKitを含む。
SwiftUI

2.2.3. Windows
--------------

Microsoft Foundation Class  は、1990年代から存在するWindows専用の古いC++フレームワークである。MFCはWindows APIの薄いラッパーであり、独立したツールキットではない。
Windows Template Library  は、ATLの拡張であり、C++テンプレートに基づいたWindows APIのラッパーである。MFCよりも軽量なフレームワークを提供する。
Object Windows LibraryはMFCに相当するボーランドのライブラリ。これもWindows API  のラッパーであり、独立したツールキットではない。
Visual Component Library  はボーランドのC++BuilderとDelphi製品に含まれているツールキット。これもWindows API  のラッパーであり、独立したツールキットではないが、MFCよりも高度な抽象化およびRAD環境を提供する。
Windows Forms  は、.NET Frameworkにおけるマネージコード向けWindows APIのラッパーであり、GUI制御用のクラスライブラリからなる。設計はVCLに近く、Microsoft Visual Studioに統合されたRADをサポートする。Monoによる互換実装も存在するMonoは.NETのクロスプラットフォームかつオープンソースの実装であり、Windows APIのない[[プラットフォーム 。Windows限定で.NET Core 3.0以降にも移植された。
Windows Presentation Foundation  は、.NET Framework 3.0以降で利用可能なグラフィックスサブシステムである。Direct3Dによるハードウェアレンダリングアクセラレーションをサポートしている。WPFでのユーザーインターフェイスは、任意のCLR言語やXMLベースのXAML言語を使って定義できる。WPF向けのGUIビルダーとしてMicrosoft Expression Blendがある。Windows限定で.NET Core 3.0以降にも移植された。
Windowsランタイム  およびWindows UI Library  は、Windows 8で実装されたModern UIアプリケーション開発・実行用のCOMベースフレームワークである。WPF同様にXAMLを利用したUI定義が可能となっている。

2.2.4. Android
--------------

レイアウトXML - 独自のXML形式を利用してレイアウトやカスタム部品を定義できる。
Jetpack Compose - Kotlinのみを使用してUIを宣言的に記述できるフレームワーク。SwiftUIと類似のコンセプトを持つ。

2.2.5. UNIX と X Window System
-----------------------------

Xawは、Project Athenaで開発されたX Window System用のウィジェットセット。
MotifはCommon Desktop Environmentで使用されている。
LessTif はMotifのオープンソース版 。
InterViewsはC++で書かれたツールキット。

2.2.6. クロスプラットフォーム
------------------

Flashベース
Adobe Flashを使って多くのウェブブラウザと一部の携帯電話で機能するウィジェットを作成できる。
Adobe Flexはウェブブラウザ用の高度なウィジェットを提供する。FlashのウィジェットはFlexで利用可能。
date=2022-03。
Flashのフリーソフトウェアとしての再実装がGNU Gnashである。開発中であるが、こちらもFlashのウィジェットをウェブブラウザを使わずに利用可能。
XMLベース
XUL
XAMLおよび.NETベース
Silverlight/Moonlight
Xamarin.Forms
.NET Multi-platform App UI 
Ajaxベース
[1]はウェブ用のQtである。
jQuery
[2]
Google Web Toolkit
[3]
Ext JS
Javaベース
Abstract Window Toolkit  はJavaアプリケーションで使用される。プラットフォーム毎にウィジェット・ツールキットを切り替えて使用する。
Swingは サン・マイクロシステムズが AWTを改良・拡張したもの。
Standard Widget Toolkit  は Eclipse計画の一環としてIBMによって開発された Java用ウィジェット・ツールキット。動作する環境のウィジェットを使用する。100% Pure Javaではない。
JavaFX
C言語/C++ベースおよびマルチ言語ベース
CLX  は、ボーランドのDelphi、C++Builder、Kylixで使用されている。Qtをベースにしており、同社のVCLツールキットとよく似たインタフェースとなっている。
GTKは、オープンソース  であり、主にX Window Systemで使われている。他のプラットフォーム上にも移植あるいはエミュレータが存在する。GNOMEおよびXfceデスクトップ環境で使われている。
Qtは、オープンソース  であり、Unix/Linux 、Windows、macOS、さらに組み込みシステムで使用可能である。また、商用バージョン  も存在する。KDEで使われている。
Tkは、Tcl上あるいは他のスクリプト言語で使用するウィジェットセット。
wxWidgetsは、オープンソースであり、C++、Python、Perlから使えるクロスプラットフォームなツールキットである。
FLTKは、オープンソース  であり、小さくて高速なのが特徴。
[4] は、オープンソース  であり、クロスプラットフォームである。
[5][6]
[7]
[8]
[9]
[10]
[11] 
[12]
NWSTK
Pascalベース
LazarusはFree PascalおよびObject Pascal向けの統合開発環境であり、ウィジェット・ツールキットを含む。
[13]
[14]

2.3. カテゴリ分けされていないもの
-------------------

GNUstep
[15]

3. 脚注
-----

3.1. 注釈
-------

3.2. 出典
-------

4. 外部リンク
--------

[16], 最近のGUIツールキットを比較している .
[18]  
[19]