QtMDIウィンドウ開発



Qt Mdi Window Development




リリースノート

バージョン 著者 日付 備考
0.1 給料 2018.11.2 初稿

目次

記事のディレクトリ

まず、需要分析

次の構造のような構成ソフトウェアを実行し、その基本構造を分析し、メインUIフレームワークとしてMDIウィンドウが必要であることがわかったため、QtMDIウィンドウアプリケーションのプログラミングを理解する必要があります。

画像



次に、MDIウィンドウとは何ですか

MDIは、マルチドキュメントインターフェイスであるMultiple DocumentInterfaceの略語です。 VC ++開発では、MFCを使用する場合、プロジェクトを作成するときに、通常、単一のドキュメントフォームまたは複数のドキュメントフォームを選択するようにユーザーをガイドします。 MDIは、Microsoftが開発者に複数のドキュメントを同時に作成するために提供するプログラミングインターフェイスです。いわゆるドキュメントは、独自のスペースで特定のトランザクションを処理するスレッドに相当します。ユーザーは、マウスをあるスペースから別のスペースに移動するだけで、デジタルレポートの作成、テキスト編集、または描画を表示または完了することができます。 MDIアプリケーションはWindowsデスクトップインターフェイスに似ており、MFCでよく呼ばれる複数のビューが含まれています。ただし、Windowsデスクトップインターフェイスとは異なり、MDIのビュースペースはこのアプリケーションに制限されています。 MDIは、同じデータのさまざまな表現を表示し、ブラウザで同時に複数のWebページを開いて、複数のフォーム間で値を渡すために広く使用されています。つまり、複数のトランザクションを同時に処理する必要がある状況では、複数のドキュメントインターフェイスが使用されます。実際、私たちがよく言う並列計算と同様に、それは表現の異なる形式にすぎません。

MDIアプリケーションは、少なくとも2つの異なるウィンドウで構成されます。最初のウィンドウはMDIコンテナと呼ばれ、コンテナに表示できるウィンドウはMDI子ウィンドウと呼ばれます。



QtはMDIウィンドウもサポートしています。 QMdiAreaやQMdiSubWindowなどのMDIを直接検索すると、関連するコンテンツを見つけることができます。ここで、QMdiAreaはMDIコンテナーであり、QMdiSubWindowはMDI子ウィンドウです。

第三に、MDI関連のQtクラスの紹介

上記のように、QtのMDIプログラミングには、QMdiAreaとQMdiSubWindowの2つの主要なカテゴリが含まれ、QMdiAreaはコンテナを提供し、QMdiSubWindowは子ウィンドウを提供します。 QMdiAreaプログラミングはQt4.4から派生しているため、Qt4.4以上である必要があります。

ヘルプマニュアルでMDIを直接検索して、関連するコンテンツを見つけます。
画像



1、QMdiArea

QMdiAreaウィジェットは、MDIウィンドウを表示するための領域を提供します。

QMdiArea関数は、基本的にMDIウィンドウのウィンドウマネージャーに似ています。たとえば、独自の管理対象ウィンドウを描画し、カスケードモードまたはタイリングモードで配置します。 QMdiAreaは、MDIアプリケーションを作成するためのQMainWindowの中央ウィジェットとしてよく使用されますが、任意のレイアウトに配置することもできます。次のコードは、メインウィンドウに領域を追加します。

QMainWindow *mainWindow = new QMainWindow mainWindow->setCentralWidget(mdiArea)

トップレベルウィンドウのウィンドウマネージャーとは異なり、すべてのウィンドウフラグ(Qt :: WindowFlags)は、現在のウィジェットスタイルでサポートされている限り、QMdiAreaでサポートされます。スタイルが特定のフラグ(たとえば、WindowShadeButtonHint)をサポートしていない場合でも、showshade()を使用してウィンドウをシェーディングできます。

QMdiAreaの子ウィンドウは、QMdiSubWindowのインスタンスです。これらは、addSubWindow()を使用してMDI領域に追加されます。 QWidgetセットを内部ウィジェットとしてこの関数に渡すのが一般的ですが、QMdiSubWindowを直接渡すこともできます。このクラスはQWidgetを継承しており、プログラミング時に通常のトップレベルウィンドウと同じAPIを使用できます。 QMdiSubWindowには、MDIウィンドウに固有の動作もあります。詳細については、QMdiSubWindowクラスの説明を参照してください。

子ウィンドウは、キーボードフォーカスを取得するか、setFocus()を呼び出すと、アクティブになります。ユーザーは通常の方法でフォーカスを移動してウィンドウをアクティブにします。 MDI領域は、アクティブウィンドウが変更されると、子ウィンドウのアクティブ化()シグナルを発行し、activeSubWindow()関数はアクティブな子ウィンドウを返します。

便利な関数subWindowList()は、すべての子ウィンドウのリストを返します。たとえば、ウィンドウのリストを含むポップアップメニューでこの情報を使用できます。

子ウィンドウは、現在のウィンドウの順序で並べ替えられます。これは、子ウィンドウリスト()とactivateNextSubWindow()およびactivatePreviousSubWindow()に使用されます。同様に、cascadeSubWindows()およびtileSubWindows()を使用してウィンドウをカスケードまたはタイリングするときに使用できます。

QMdiAreaは、子ウィンドウに2つの組み込みレイアウト戦略(cascadeSubWindows()とtileSubWindows())を提供します。どちらもスロットで、メニュー項目に簡単に接続できます。

注:QMdiAreaのデフォルトのスクロールバープロパティはQt :: ScrollBarAlwaysOffです。

これはQMdiAreaの使用法の紹介です。ここでの特定のAPIは言うまでもありません。指定されたMDIの例を組み合わせて呼び出し方法を確認し、サンプルコードで対応するAPI関数を確認できます。

2、QMdiSubWindow

QMdiSubWindowを直接検索すると、クラス全体の説明と、対応するメソッドおよびプロパティを見つけることができます。

画像

QMdiSubWindowクラスは、QMdiAreaの子ウィンドウクラスを提供します。

QMdiSubWindowは、QMdiAreaの最上位ウィンドウを表し、ウィンドウ装飾、内部ウィジェット、および(現在のスタイルに応じて)サッシとサイズのハンドルを備えたタイトルバーで構成されます。 QMdiSubWindowには独自のレイアウトがあり、タイトルバーと内部ウィジェットの中央領域で構成されています。

QMdiSubWindowを構築する最も一般的な方法は、内部ウィジェットをパラメーターとしてQMdiArea :: addSubWindow()を呼び出すことです。 setWidget()を呼び出して、自分で子ウィンドウを作成し、内部ウィジェットを設定することもできます。

子ウィンドウをプログラミングするときは、通常のトップレベルウィンドウと同じAPIを使用できます(たとえば、show()、hide()、showMaximized()、setWindowTitle()などの関数を呼び出すことができます)。

QMdiSubWindowは、MDI領域でのサブウィンドウ固有の動作もサポートします。

デフォルトでは、各QMdiSubWindowはMDIエリアビューに表示されますが、子ウィンドウのアウトラインのみが更新される、透過的なウィンドウの移動とサイズ変更の動作を指定することもできます。 setOption()関数は、この動作を有効にするために使用されます。

isShaded()関数は、子ウィンドウが現在色付けされているかどうかを検出するために使用されます。 (つまり、ウィンドウが折りたたまれているため、タイトルバーのみが表示されます)。シャドウモードに入るには、showshade()を呼び出します。 QMdiSubWindowは、ウィンドウの状態が変化したとき(たとえば、ウィンドウが最小化または復元されたとき)にwindowStateChanged()シグナルを発行します。また、アクティブ化される前にaboutToActivate()を発行します。

キーボードインタラクティブモードでは、ウィンドウはキーボードによって移動およびサイズ変更されます。このモードには、ウィンドウのシステムメニューからアクセスできます。 keyboardSingleStepプロパティとkeyboardPageStepプロパティは、各キーイベントのウィジェットの移動またはサイズ変更の距離を制御します。シフトキーが押されたときにページステップを使用し、それ以外の場合はシングルステップを使用します。

キーボードを使用してアクティブウィンドウを変更することもできます。コントロールキーとタブキーを同時に押すと、次の(現在のWindowOrderを使用して)サブウィンドウがアクティブになります。 Control、Shift、Tabを押すと、前のウィンドウがアクティブになります。これは、activateNextSubWindow()およびactivatePreviousSubWindow()を呼び出すことと同じです。これらのショートカットはグローバルショートカットをオーバーライドしますが、QMdiAreasショートカットをオーバーライドしないことに注意してください。

特定のAPIについては1つずつ説明しません。 Qtに付属している例を見てみましょう。

第四に、QtMDIの例

例でMDIを直接検索し、対応する例を見つけて、構成およびコンパイルすると、結果は次のようになります(2つのウィンドウを開いてタイル状に並べます)。

画像

次に、ヘルプマニュアルにMDIの例があります。

画像

この例に含まれているファイルと画像のリソースを確認できます。

説明はコードを入力しただけで、指定していませんが、前の形式(mainwindow、mdichild、main、mdi)に従って除算を確認し、次にプロに追加する必要があるもの、qrcの方法を確認します。リソースファイルを追加します。対応するツールバー機能はメインドウで提供され、mdichildのツールバーに必要な機能は対応するサブウィンドウに実装されており、レベルは依然として非常に明確です。メインウィンドウ構造、newFile、デストラクタ、およびその他のメソッドでは、QtMDIプログラミングAPI呼び出しは難しくありません。

第五に、最後

タイルレイアウトに加えて、2つのウィンドウのデータを関連付ける方法、垂直レイアウトにできるかどうかなど、必要な機能の実現に基づいて、基本の使用は難しくありません。 canこれは柔軟な処理に基づいています。