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

## 概要
高レベルなウィジェット・ツールキットは、GUIの生成と振る舞いを管理するAPIである。
- GUIは、ウィジェットの木構造として生成されることが多く、その一部がユーザーとのやり取りが可能となっていて（ボタン、チェックボックスなど）、他はウィジェットをグループ化するコンテナである（ウィンドウ、パネルなど）。
- ウィジェットの木構造の中身やウィジェットの属性は、実行時に変更可能であるものが多い（例えば、木構造からウィジェットを追加・削除できる）。
- ツールキットはボタンをクリックするなどのユーザーイベントを扱う。イベント検出後のアクションはツールキットが指定するものではなく、アプリケーションが指定する。例えば、ファイルダイアログ（英語版）からユーザーがファイルを選択したら、ファイルダイアログ・ウィジェット自身の反応とそのユーザーイベントの検出はウィジェット・ツールキットが扱うが、ファイルを選択したことに対応する具体的なアクション（そのファイルを読み込むなど）はアプリケーション自身が行う。

ウィジェット・ツールキットは、コンテナの中でのウィジェットの位置決めの手段を必ず持っている。最も簡単な方法は、画面上の絶対座標や上位ウィジェットからの相対座標をピクセル単位で指定する方法だが、ウィジェット同士の相対的な位置関係だけを指定して具体的な座標を指定しない方法もある（レイアウトマネージャ）。多くのツールキットは、統合開発環境と連携した視覚的なGUIデザイナーをサポートし、直感的なGUI部品の配置およびプレビューを使用したプロトタイピング (Rapid Application Development, RAD) も可能となっている。
GUI部品の配置や各種プロパティの設定は、ロジックを記述するためのプログラミング言語によって直接ソースファイルに記述する方法のほか、独自のリソーススクリプトやXMLなどの形式で、ロジックを記述するソースファイルとは別のファイルに分けて記述することのできる機能をサポートするツールキットもある。レイアウト定義を別ファイルに分離することで、直感的なプレビューやプロトタイピングを可能にするデザイン補助ツールを開発しやすくなるなどのメリットがあるが、複数のファイルにUIの記述が分散することで、逆に実装が複雑化してしまったりするデメリットもある。プログラマーが手作業で編集せずに、デザイン補助ツールを経由して操作することで自動生成されたレイアウト定義ファイルのコードは、バージョン管理ツールなどを用いて複数人でソースコードを共有して開発する際にコンフリクトの解消が難しくなることもある。
ウィジェットのルック・アンド・フィールはツールキット内でハードコードされる場合もあるが、ウィジェット・ツールキットによってはユーザーがルック・アンド・フィールを定義できるAPIを提供している。
GUIアプリケーションの開発効率やメンテナンス性を向上するために、Model-View-Controller (MVC) やModel-View-ViewModel (MVVM) といった設計パターンが使用されることもある。ツールキットが標準的にこれらの設計パターンをサポートしていることもある。MVVMに関してはデータバインディング機能のサポートが前提となる。

## 主要なウィジェット・ツールキット

### 低レベルなもの

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


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


### 高レベルなもの

#### macOS
- Cocoa - macOSのアプリ開発で使用される（Aquaも参照されたい）。UIフレームワークとしてAppKitを含む[2][3]。
- MacApp（英語版） - Macintosh (Mac OS XおよびMac OS 9) フレームワーク[4]。
- MacZoop - Macintosh C++フレームワーク。
- PowerPlant（英語版） - Macintoshフレームワーク。
- SwiftUI - Swiftのみを使用してUIを宣言的に記述できるフレームワーク[5]。


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


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


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


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


#### クロスプラットフォーム
- Flashベース
  - Adobe Flashを使って多くのウェブブラウザと一部の携帯電話で機能するウィジェットを作成できる。
  - Adobe Flexはウェブブラウザ用の高度なウィジェットを提供する。FlashのウィジェットはFlexで利用可能。
  - FlashとFlexのウィジェットはAdobe Integrated Runtime (AIR) を使ってウェブブラウザを用いずに利用可能となる予定である[いつ?]。
  - Flashの自由ソフトウェアとしての再実装がGNU Gnashである。開発中であるが、こちらもFlashのウィジェットをウェブブラウザを使わずに利用可能。
- XMLベース[注釈 2]
  - XUL
- XAMLおよび.NETベース
  - Silverlight/Moonlight
  - Xamarin.Forms
  - .NET Multi-platform App UI (.NET MAUI)
- Ajaxベース
  - Qooxdooはウェブ用のQtである。
  - jQuery
  - Dojo Toolkit
  - Google Web Toolkit
  - Yahoo! UI Library
  - Ext JS
- Javaベース
  - Abstract Window Toolkit (AWT) はJavaアプリケーションで使用される。プラットフォーム毎にウィジェット・ツールキットを切り替えて使用する。
  - Swingは サン・マイクロシステムズが AWTを改良・拡張したもの。
  - Standard Widget Toolkit (SWT) は Eclipse計画の一環としてIBMによって開発された Java用ウィジェット・ツールキット。動作する環境のウィジェットを使用する。100% Pure Javaではない。
  - JavaFX
- C言語/C++ベースおよびマルチ言語ベース
  - CLX (Component Library for Cross-platform) は、ボーランドのDelphi、C++Builder、Kylixで使用されている。Qtをベースにしており、同社のVCLツールキットとよく似たインタフェースとなっている。
  - GTKは、オープンソース (LGPL) であり、主にX Window Systemで使われている。他のプラットフォーム上にも移植あるいはエミュレータが存在する。GNOMEおよびXfceデスクトップ環境で使われている。
  - Qtは、オープンソース (LGPL) であり、Unix/Linux (X Window System)、Windows、macOS、さらに組み込みシステムで使用可能である。また、商用バージョン (QPL) も存在する。KDEで使われている。
  - Tkは、Tcl上あるいは他のスクリプト言語（Pythonなど）で使用するウィジェットセット。
  - wxWidgets（以前の名称はwxWindows）は、オープンソース（ゆるいLGPL）であり、C++、Python、Perlから使えるクロスプラットフォームなツールキットである。
  - FLTKは、オープンソース (LGPL) であり、小さくて高速なのが特徴。
  - FOX toolkit は、オープンソース (LGPL) であり、クロスプラットフォームである。
  - Agar移動した?
  - CEGUI
  - GLUI
  - Juce
  - Ultimate++
  - Visual Component Framework (VCF)
  - YAAF
  - NWSTK

- Pascalベース
  - LazarusはFree PascalおよびObject Pascal向けの統合開発環境であり、ウィジェット・ツールキットを含む。
  - IP Pascal
  - fpGUI


### カテゴリ分けされていないもの
- GNUstep
- MetaCard