Qt ウィンドウ タイプ、ウィンドウ フラグ、ウィンドウ プロパティ

1.窓の種類

Qt Window Flags 列挙型は、ウィジェットのさまざまなウィンドウ システム プロパティを指定するために使用されます。これらのフラグの一部は、基になるウィンドウ マネージャーがそれらをサポートしているかどうかによって異なります。以下はウィンドウの種類のリストです。

窓の種類

説明

Qt::Qウィジェット

これは QWidget のデフォルトのタイプです。このタイプのウィジェットは、親がある場合は子ウィジェット、親がない場合はスタンドアロン ウィンドウです。

Qt::ウィンドウ

通常、ウィンドウ システム フレームとタイトル バーがあります。ウィジェットに親コントロールがない場合、このフラグは設定解除できないことに注意してください (ポップアップ子ウィンドウが親ウィンドウよりもはるかに大きい場合に使用できます)。

Qt::ダイアログ

ダイアログ (通常、タイトル バーに最大化または最小化ボタンはありません)。dget これは QDialog のデフォルトのタイプです。モーダルダイアログとして使用したい場合は、別のウィンドウから起動する必要があります。

Qt::シート

macOS フォーム スタイルのウィンドウ。シートの使用はウィンドウ モダリティを意味するため、QWidget::setWindowModality() または QDialog::open() を使用することをお勧めします。

Qt::ドロワー

macOS ドロワー ウィンドウ。

Qt::ポップアップ

ポップアップのトップレベル ウィンドウ。つまり、モーダルですが、ポップアップ メニューに適合するウィンドウ システム フレームがあります。

Qt::ツール

ツールウィンドウ。ツール ウィンドウは通常、通常よりも小さいタイトル バーと装飾を備えた小さなウィンドウで、通常はツール ボタンの集合です。親ウィジェットがある場合、ツール ウィンドウは常にその上に表示されます。

Qt::ツールチップ

ツールチップウィンドウ。これは、タイトル バーやウィンドウの境界線のないツールチップを実装するために内部的に使用されます。

Qt::スプラッシュスクリーン

スプラッシュ画面。これは QSplashScreen のデフォルトのタイプです。

Qt::サブウィンドウ

QMdiSubWindow ウィジェットなどのサブウィンドウ。

Qt::ForeignWindow

別のプロセスまたはネイティブ コードを使用して手動で作成されたネイティブ プラットフォーム ウィンドウへのハンドルを表します。

Qt::カバーウィンドウ

たとえば、アプリケーションが BlackBerry プラットフォームで最小化されているときに表示されるカバー ウィンドウを表します。

2. ウィンドウサイン

以下は、設定できる複数のウィンドウ フラグの比較表です。

窓の看板

説明

Qt::MSWindowsFixedSizeDialogヒント

Windows システムの固定サイズの狭い境界線ウィンドウ

Qt::X11BypassWindowManagerヒント

ウィンドウ境界線のないウィンドウはウィンドウ マネージャーを完全に無視し、ユーザーは入力にキーボードを使用できません (QWidget::activateWindow() 関数が手動で呼び出されない限り)

Qt::FramelessWindowヒント

ウィンドウの境界線がないとウィンドウの移動やサイズ変更ができない

Qt::NoDropShadowWindowヒント

ウィンドウの影を無効にする

Qt::WindowTitleHint

タイトルバーのあるウィンドウ

Qt::WindowSystemMenuHint

システム メニューと、場合によっては閉じるボタンのあるウィンドウ

Qt::CustomizeWindowHint

デフォルトのウィンドウタイトルのツールチップをオフにする

Qt::Window最小化ボタンヒント

ウィンドウに最小化ボタンを追加する

Qt::WindowMaximizeButtonヒント

ウィンドウに最大化ボタンを追加する

Qt::WindowCloseButtonヒント

ウィンドウに閉じるボタンを追加する

Qt::WindowContextヘルプボタンヒント

ウィンドウにヘルプボタンを追加する

Qt::WindowShadeButtonヒント

ウィンドウマネージャーがサポートしている場合、最小化ボタンの代わりにシャドウボタンを追加します。

Qt::WindowStaysOnTopHint

通知ウィンドウ システムスティッキー ウィンドウ

Qt::WindowStaysOnBottomヒント

通知ウィンドウシステムは下部ウィンドウに配置されます

  • 一般的な例:
  • // ウィンドウの境界線を設定しません | ウィンドウの上部 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
  • Qt には、Qt で利用可能なウィンドウ フラグ タイプを使用してウィンドウ システム プロパティを指定する方法を示す Window Flags と呼ばれるデモがありますQtCreator ソフトウェアには次のものがあります。

この記事の利点は、Qt 開発学習教材パッケージ、技術ビデオ (C++ 言語基礎、Qt プログラミング入門、QT シグナルおよびスロット メカニズム、QT インターフェイス開発イメージ描画、QT ネットワーク、QT データベース プログラミング、QTプロジェクトコンバット、QSS、OpenCV、クイックモジュール、インタビューの質問など) ↓↓↓↓下記を参照↓↓記事下部をクリックして料金を受け取ります↓↓ 

3. ウィンドウのプロパティ

Qt::WidgetAttribute 列挙属性は、setAttribute 関数を通じて QWidget オブジェクトに設定でき、それによって QWidget オブジェクトの一部の特性が変更されます。

  • Qt::WA_AcceptDrops: ドラッグ アンド ドロップを受け入れます。QWidget::setAcceptDrops() はこの設定の便利な関数です。
  • Qt::WA_DeleteOnClose: QWidget を閉じると削除されます。
  • Qt::WA_Disabled: ウィジェット (これはウィジェットであり、ウィンドウでは無効であることに注意してください) を無効に設定します (setEnabled(false); の呼び出しに関連して)。
  • Qt::WA_ForceUpdatesDisabled: 更新を無効にします。すべての祖先が更新を有効にするように設定されている場合でも、無効のままになります。(QWidget::setUpdatesEnabled() の呼び出しと同等)。
  • Qt::WA_Hover: マウスがウィジェットに出入りするときに Qt にペイント イベントを生成させます。この機能は通常、カスタム スタイルを実装するときに使用されます。
  • Qt::WA_InputMethodEnabled: アジア言語の入力メソッドを有効にします。カスタム テキスト編集ウィジェットを作成するときに設定する必要があります。
  • Qt::WA_KeyboardFocusChange: ユーザーがキーボード (タブ、バックタブ、またはショートカット) を使用するときにフォーカスを変更します。トップレベルのウィンドウ設定に使用されます。
  • Qt::WA_NoChildEventsForParent: ウィジェットは、ChildAdded または ChildRemoved イベントを親に送信することを望んでいません。
  • Qt::WA_NoChildEventsFromChildren: ウィジェットは、子から送信された ChildAdded または ChildRemoved イベントの受信を希望しません。
  • Qt::WA_NoMousePropagation: ウィジェットの親へのマウス イベントの伝播を無効にします。このプロパティはデフォルトでは無効になっています。
  • Qt::WA_TransparentForMouseEvents: ウィジェットとその子へのマウス イベントの配信を無効にします。このプロパティはデフォルトでは無効になっています。
  • Qt::WA_NoSystemBackground: ウィジェットには背景がありません。つまり、ウィジェットがペイント イベントを受け取ったときに、背景は自動的に再描画されません。ウィンドウを設定した効果は完全に黒になります。
  • Qt::WA_OpaquePaintEvent: ウィジェットはペイント イベントを受け取ると、そのすべてのピクセルをペイントします。したがって、更新、サイズ変更、スクロール、フォーカス変更などの操作では、ペイント イベントを生成する前にウィジェットを消去する必要はありません。
  • Qt::WA_PaintUncliped: このウィジェット上で操作されるすべての QPainter オブジェクトの描画をクリップしないようにします (つまり、QPainter によって設定されたクリッピング領域が無効になります)。このフラグは、Qt::WA_PaintOnScreen フラグが設定されたウィジェットでのみサポートされます。
  • Qt::WA_PaintOnScreen: ウィジェットが画面上に直接描画されることを示します。この属性セットを持つウィジェットは構成管理に参加しません。つまり、ウィジェットを半透明にすることも、半透明の重なり合うウィジェットを通して光らせることもできません。ダブルバッファリングが無効になります。
  • Qt::WA_QuitOnClose: ウィジェットが最後に closeEvent() を受け取ったときに、Qt がアプリケーションを終了します。この動作は、QApplication::quitOnLastWindowClosed プロパティを使用して変更できます。デフォルトでは、このプロパティは Qt::Window タイプのすべてのウィジェットに設定されます。
  • Qt::WA_Resize: ウィジェットに明示的なサイズがあることを示します。このフラグは、QWidget::resize() および QWidget::setGeometry() によってセットまたはクリアされます。
  • Qt::WA_AlwaysShowToolTips: 非アクティブなときにプロンプ​​ト情報を表示するようにウィンドウ (QWidget が子コンポーネントとして使用されている場合は無効であることに注意してください) を設定します。(setToolTip() はウィンドウ プロンプト情報を設定します)

以下では、一般的に使用される属性または特殊な属性をいくつか取り上げます。

3.1 Qt::WA_TransparentForMouseEvents

Qt Assistant の Qt::WA_TransparentForMouseEvents の説明は次のとおりです。

この属性を有効にすると、ウィジェットとその子へのマウス イベントの配信が無効になります。マウス イベントは、ウィジェットとその子がウィジェット階層に存在していないかのように、他のウィジェットに配信されます。マウスのクリックやその他のイベントは効果的にそれらを「通過」します。この属性はデフォルトでは無効になっています。

効果は次のとおりです。

このプロパティを有効にすると、フォームおよびフォーム内の子コントロールに送信されるすべてのマウス イベントが無効になります。マウス イベントは、このウィジェットとその子コントロールがウィジェット階層に表示されていないかのように、他のウィジェットに配布されます。マウス クリックやその他のマウス イベントは、このウィジェットとそのサブコントロールを効率的に通過します (つまり、バイパスします)。このプロパティはデフォルトでは無効になっており、有効になっていません。

3.2 Qt::WA_StaticContents

Qt 公式では、Qt::WA_StaticContents について次のように説明しています。

ウィジェットのコンテンツが北西に配置され、静的であることを示します。サイズ変更の際、このようなウィジェットは、新しく表示されたウィジェット自体の部分に対してのみペイント イベントを受け取ります。このフラグは、ウィジェットの作成者によって設定またはクリアされます。

中国語に翻訳すると、次の意味になります。フォームのコンテンツが北西方向、つまり左上隅に揃えられ、静的であることを示します。フォームのサイズを変更すると、フォームの新しく表示された部分のみが描画されます。このフラグは、フォームの開発者によってクリアまたは設定されます。

通常、ウィジェットのサイズを変更すると、Qt はウィジェットの表示領域全体に対してペイント イベントを生成します。ただし、ウィジェットが Qt::WA_StaticContens 属性を使用して作成されている場合、描画イベントの領域は、以前に表示されていない部分に厳密に制限されます。これは、ウィジェットのサイズが元のサイズよりも小さくなった場合、ペイント イベントはまったく生成されないことを意味します。場合によっては、これによりパフォーマンスが向上し、CPU 効率が低下する可能性があります。事前に描画するのに時間がかかる場合 (特定の曲線、特定の複雑な数学的演算を通じて特定の図形が得られるなど)、再計算せずに描画することは重要ではありません。 CPU 時間を大幅に節約し、効率を大幅に向上させます。

3.3 Qt::WA_OpaquePaintEvent

Qt::WA_OpaquePaintEvent は、Qt アシスタントで次のように説明されています。

ウィジェットがペイント イベントを受信したときにすべてのピクセルをペイントすることを示します。したがって、更新、サイズ変更、スクロール、フォーカス変更などの操作で、ペイント イベントを生成する前にウィジェットを消去する必要はありません。WA_OpaquePaintEvent を使用すると、ダブル バッファリングをサポートしていないシステムでのちらつきを軽減し、ペイント前に背景を消去するために必要な計算サイクルを回避することで、小規模な最適化が実現します。注: WA_NoSystemBackground とは異なり、WA_OpaquePaintEvent はウィンドウの背景が透明になるのを避けるように努めます。このフラグは、ウィジェットの作成者によって設定またはクリアされます。

その意味はおおよそ次のとおりです。

フォームがペイント イベントを受け取ったときに、すべてのピクセルをペイントするようにフォームに指示します。したがって、フォームは、ペイント イベントを受け取る前に、更新、サイズ変更、スクロール バーのスクロール、フォーカスの変更などのためにフォームの背景を消去する必要はありません。このフラグを使用すると、ダブル バッファをサポートしていないシステムに小さな最適化が提供され、ちらつきが軽減され、描画前に背景を消去するために必要な時間のかかる計算が回避されます。WA_NoSystemBackground フラグとは異なり、WA_OpaquePaintEvent はフォームの背景が透明になるのを防ぎます。このフラグはフォームの開発者によって設定またはクリアされます。

注: WA_OpaquePaintEvent 属性の設定は、スタイル シートによって設定されたウィンドウの背景色に影響を与える場合があります。

以上がQtの公式説明です。私の個人的な理解は次のとおりです。

  • フォームがペイント イベントを受け取ったときに、すべてのピクセルをペイントするようにフォームに指示します。ここでの「描画イベントの受信」の個人的な理解は、描画イベントを初めて受信したとき、つまりフォームが構築されたときに、フォームのすべてのピクセルが 1 回描画されるということです。
  • フォームが完成すると、前述のようにすべてのピクセルを描画した後、それ以降のすべての更新、サイズ変更、フォーカス変更、スクロール バーのスクロール、およびフォームに関連するその他の操作を行っても、フォームの背景は消去されません。つまり、以前に描いたものを消して描き直すことはありません。つまり、前の描画は再計算または再描画されません。以前に描画するのに時間がかかる場合 (特定の曲線、特定の複雑な数学的演算を通じて特定の図形が得られる場合など)、再描画または再計算を行わないでください。これにより、CPU 時間が大幅に節約され、効率が大幅に向上します (これはこのフラグを設定した後に点滅しないのはなぜですか)。

3.4 Qt::WA_NoMousePropagation

Qt では、マウス イベントには、マウス ボタンを押す、マウス ボタンを離す、マウス ダブルクリック イベント、マウス移動イベントが含まれます。これらはそれぞれ、次のイベント ハンドラー (イベント ハンドラー。実際にはオーバーライドできる関数) によって処理されます。

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);

マウス イベントはバブリング イベントであり、マウス イベントは、その祖先が配置されているウィジェットがそれを受け入れるか、イベント フィルターがそれを消費するまで、常にその親チェーンに沿ってルーティングされます。

注: マウス イベントが Qt::WA_NoMousePropagation ウィンドウ プロパティを含むウィジェットにルーティングされる場合 (つまり、プロパティが true に設定されている場合)、マウス イベントは親コントロール チェーンの下位にはルーティングされません。

この記事の利点は、Qt 開発学習教材パッケージ、技術ビデオ (C++ 言語基礎、Qt プログラミング入門、QT シグナルおよびスロット メカニズム、QT インターフェイス開発イメージ描画、QT ネットワーク、QT データベース プログラミング、QTプロジェクトコンバット、QSS、OpenCV、クイックモジュール、インタビューの質問など) ↓↓↓↓下記を参照↓↓記事下部をクリックして料金を受け取ります↓↓

おすすめ

転載: blog.csdn.net/QtCompany/article/details/131647535