このページでは

ウィンドウおよびダイアログウィジェット

親ウィジェットに埋め込まれていないウィジェットは、ウィンドウと呼ばれます。通常、ウィンドウにはフレームとタイトルバーがありますが、適切なウィンドウフラグを使用することで、こうした装飾のないウィンドウを作成することも可能です。Qtでは、QMainWindow およびQDialog の各種サブクラスが、最も一般的なウィンドウタイプです。

アプリケーションにおいて、ウィンドウはユーザーインターフェースを構築するための画面領域を提供します。ウィンドウはアプリケーション同士を視覚的に区切り、通常は、好みに応じてアプリケーションのサイズ変更や配置ができるようなウィンドウ装飾を提供します。 ウィンドウは通常、デスクトップ環境に統合されており、デスクトップ環境が提供するウィンドウ管理システムによってある程度管理されています。例えば、アプリケーションの選択されたウィンドウはタスクバーに表示されます。

プライマリウィンドウとセカンダリウィンドウ

親を持たないQWidget はすべてウィンドウとなり、ほとんどのプラットフォームではデスクトップのタスクバーに表示されます。これは通常、アプリケーション内の1つのウィンドウ、すなわちプライマリウィンドウに対してのみ意図されるものです。

さらに、親ウィンドウを持つQWidget も、Qt::Window フラグを設定することでウィンドウになることができます。ウィンドウ管理システムによっては、このようなセカンダリウィンドウは通常、それぞれの親ウィンドウの上に重ねて表示され、独自のタスクバー項目は持ちません。

QMainWindow クラスは、ウィンドウとして使用されることを想定して設計されており、子ウィジェットには不要な機能を提供しているため、コンストラクタ内でQt::Window フラグを設定します。

メインウィンドウとダイアログ

アプリケーションのメインウィンドウは、アプリケーションのメインユーザーインターフェースを構築するためのフレームワークを提供し、QMainWindow をサブクラス化することで作成されます。QMainWindow には独自のレイアウトがあり、そこにmenu bar 、tool bars 、dockable widgets 、およびstatus bar を追加することができます。中央領域には、あらゆる種類のQWidget を配置することができます。

ダイアログウィンドウは、オプションや選択肢を表示する補助的なウィンドウとして使用されます。ダイアログは、QDialog をサブクラス化し、ウィジェットやレイアウトを使用してユーザーインターフェースを実装することで作成されます。さらに、ファイルやフォントの選択といった標準的なタスクに使用できる、多数の既製の標準ダイアログが用意されています。

メインウィンドウもダイアログも、QtのビジュアルデザインツールであるQt Widgets Designer を使用して作成できます。Qt Widgets Designer を使用すると、手作業でコーディングするよりもはるかに高速に作業ができ、さまざまなデザインのアイデアを簡単に試すことができます。視覚的にデザインを作成し、uicによって生成されたコードを読むことは、Qtを学ぶための素晴らしい方法です!

ウィンドウのジオメトリ

QWidget には、ウィジェットのジオメトリを扱ういくつかの関数が用意されています。これらの関数の中には、純粋なクライアント領域(つまり、ウィンドウフレームを除いたウィンドウ部分)のみを対象とするものもあれば、ウィンドウフレームを含むものもあります。QWidget は、最も一般的な使用法を透過的にカバーするような方法でこれらを区別しています。

なお、この区別が重要になるのは、装飾が施されたトップレベルウィジェットの場合のみである。すべての子ウィジェットについては、フレームのジオメトリはウィジェットのクライアントジオメトリと等しくなる。

この図は、使用されている関数のほとんどを示しています:

サイズや位置が表記されたウィンドウの形状

X11の特殊性

X11では、ウィンドウマネージャーが装飾を適用するまで、ウィンドウにはフレームがありません。これは、QWidget::show()の呼び出しと、ウィンドウが最初に受け取るペイントイベントの間のどこかの時点で非同期的に行われるか、あるいはまったく行われないかのいずれかです。 X11には固定のルールがない(柔軟だと言う人もいる)ことを念頭に置いてください。したがって、ウィンドウにどのような装飾枠が適用されるかについて、安全な仮定を立てることはできません。基本ルール:必ずどこかに、あなたの仮定を覆すようなウィンドウマネージャーを使用しているユーザーが一人いて、そのユーザーから苦情が寄せられることになるでしょう。

さらに、ツールキットは単にウィンドウを画面上に配置することしかできません。Qtができるのは、ウィンドウマネージャーに特定のヒントを送ることだけです。別プロセスであるウィンドウマネージャーは、そのヒントに従うこともあれば、無視することも、誤解することもあります。「クライアント間通信規約マニュアル(ICCCM)」の一部が不明確であるため、既存のウィンドウマネージャーではウィンドウの配置処理がそれぞれ異なっています。

X11では、ウィンドウが装飾された後にフレームのジオメトリを取得するための標準的かつ簡単な方法は提供されていません。Qtは、今日存在する幅広いウィンドウマネージャーで動作する、巧妙なヒューリスティックと洗練されたコードを用いてこの問題を解決しています。とはいえ、QWidget::frameGeometry()が誤った結果を返すウィンドウマネージャーがあったとしても、驚かないでください。

また、X11にはウィンドウを最大化する機能も提供されていません。QWidget::showMaximized()はこの機能をエミュレートする必要があります。その結果は、QWidget::frameGeometry()の結果と、ウィンドウマネージャが適切なウィンドウ配置を行う能力に依存しますが、いずれも保証されるものではありません。

Wayland の特異性

Wayland では、クライアント側からプログラムを通じてトップレベルウィンドウの位置を設定または取得することは、通常サポートされていません。技術的には、シェルインターフェースに依存します。 しかし、一般的なデスクトップコンポジターの場合、デフォルトのシェルインターフェースは `XDG Shell` となり、これはウィンドウの手動配置をサポートしていません。このような場合、Qt はウィンドウの最上位位置を設定する呼び出しを無視し、位置を問い合わせた際には、ウィンドウの位置は常に `QPoint(0, 0)` として返されます。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.