ウィンドウとダイアログ・ウィジェット
親ウィジェットに埋め込まれていないウィジェットをウィンドウと呼ぶ。通常、ウィンドウにはフレームとタイトルバーがありますが、適切なウィンドウフラグを使用することで、そのような装飾のないウィンドウを作成することも可能です。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 のビジュアルデザインツールである Qt Widgets Designer で作成できます。Qt ウィジェットデザイナーを使用すると、手作業でコーディングするよりもはるかに速く、異なるデザインのアイデアを簡単にテストできます。デザインを視覚的に作成し、uicによって生成されたコードを読むことは、Qt を学ぶのに最適な方法です!
ウィンドウのジオメトリ
QWidget には、ウィジェットのジオメトリを扱う関数がいくつか用意されています。これらの関数の中には、純粋なクライアント領域(つまり、ウィンドウフレームを除いたウィンドウ)を操作するものもあれば、ウィンドウフレームを含むものもあります。 は、最も一般的な使い方を透過的にカバーする方法で区別しています。QWidget
- ウィンドウ・フレームを含むもの: x()、y()、frameGeometry()、pos()、move()。
- 窓枠を除く: geometry ()、width ()、height ()、rect ()、size ()。
この区別は、装飾されたトップ・レベル・ウィジェットに対してのみ重要であることに注意してください。すべての子ウィジェットでは、フレーム・ジオメトリはウィジェットのクライアント・ジオメトリと等しくなります。
この図は、使用されているほとんどの関数を示しています:
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)として返されます。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。