ウィンドウとダイアログ・ウィジェット

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

アプリケーションにおいて、ウィンドウはユーザーインターフェイスを構築するための画面空間を提供します。ウィンドウはアプリケーションを視覚的に分離し、通常はウィンドウの装飾を提供します。ウィンドウは通常デスクトップ環境に統合され、デスクトップ環境が提供するウィンドウ管理システムによってある程度管理されます。例えば、アプリケーションの選択されたウィンドウはタスクバーに表示されます。

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

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

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

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

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

アプリケーション・メイン・ウィンドウは、アプリケーションのメイン・ユーザー・インタフェースを構築するためのフレームワークを提供し、QMainWindow をサブクラス化することで作成されます。QMainWindow は独自のレイアウトを持っており、menu bartool barsdockable widgetsstatus bar を追加することができます。中央の領域は、任意の種類のQWidget で占有することができます。

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

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

ウィンドウのジオメトリ

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

この区別は、装飾されたトップ・レベル・ウィジェットに対してのみ重要であることに注意してください。すべての子ウィジェットでは、フレームのジオメトリはウィジェットのクライアントのジオメトリと等しくなります。

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

Geometry diagram

X11の特殊性

X11では、ウィンドウ・マネージャがウィンドウを装飾するまで、ウィンドウはフレームを持ちません。これはQWidget::show() を呼び出した後、ウィンドウが最初にペイントイベントを受け取った時に非同期で発生します。X11はポリシーフリー(他の人はフレキシブルと呼ぶ)であることを覚えておいてください。したがって、ウィンドウが受け取る装飾フレームについて安全な仮定をすることはできません。基本的なルール基本的なルール:あなたの思い込みを破るウィンドウマネージャを使うユーザーは必ず1人はいて、あなたに文句を言うでしょう。

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

X11では、ウィンドウが装飾された後、フレームのジオメトリを取得する標準的で簡単な方法は提供されていません。Qtは、現在存在する様々なウィンドウマネージャで動作する気の利いたヒューリスティックと賢いコードでこの問題を解決します。QWidget::frameGeometry() が間違った結果を返すようなものを見つけても驚かないでください。

また、X11はウィンドウを最大化する方法を提供していません。QWidget::showMaximized()はその機能をエミュレートしなければなりません。その結果は、QWidget::frameGeometry()の結果と、ウィンドウマネージャがウィンドウを適切に配置できるかどうかに依存します。

Waylandの特殊性

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

© 2025 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.