2012-01-01 4 views
3

私は、Qtアプリケーションのウィンドウを管理するためのベストプラクティスまたはデザインパターンを探しています。Qtアプリケーションでウィンドウを管理する標準的な方法はありますか?

私は何を意味するか説明しましょう。いくつかのウィンドウ(A、B、C)を持つアプリケーションがあり、window Awindow Bに開いて、新しいwindow Aインスタンスが呼び出され、最後に表示する必要があるときに有効なパラメータを作成する必要があるとします。ウィンドウCは、既存のインスタンスを前面に持って来て、新しいインスタンスを作成します。

もちろん、実際のアプリケーションははるかに複雑で、より多くのウィンドウと制限があるため、コード全体にウィンドウ管理操作を広めたくないので、静的なWindowManagerクラスに入れておきます。 (実際にはこのクラスはシングルトンですが、静的クラスに変更することを検討しています)

WindowManagerクラスはシステム内の各ウィンドウに対して(プライベート)QSharedPointerを保持しているので、コードのどこからでもすべてのウィンドウを簡単に操作できます。 window Xを表示する必要があるときは、WindowManager::showX(params)を呼び出して、すべてのチェックと初期化がそのコードで行われます。また、私はWindowManager::minimizeX()のような方法をいくつかのロジックを処理するために、システムトレイのメッセージを表示し、ウィンドウを最小化する。

これは一般的なニーズですか、問題を解決するための一般的なパターンはありますか?どのようにあなたのアプリケーションのウィンドウを管理していますか?私は何をしましたか(静的WindowManagerクラス)は受け入れられますか?


編集:アプリケーションはシステムトレイアプリケーションなので、ウィンドウ間に親子関係はありません。代わりに、それらはお互いに独立しており、一般的には(グローバル)ホットキーで任意のウィンドウを呼び出します。しかし、窓の中で別のものを開く必要があるが、まだ彼らは親と子になることができないという少数のケースがある。

+1

私はこれと同じように複雑なものを書いているとは言えません。通常、さまざまなダイアログを持つメインウィンドウ。必要に応じてモーダルでもなくてもかまいません。特定のウィンドウを処理するためのコードは、そのウィンドウのクラスに入ります。そのウィンドウ/ダイアログが別のダイアログを必要とする場合、それは前記ダイアログの設定を管理するが、ロジックはすべてセカンダリダイアログのクラス内にある。あなたがそのモデルを使用するのを妨げる何かがありますか? – casualcoder

+0

通常、両親は子供を育てます。子ウィジェットを作成し、設定して持ち出します。メインウィンドウがある場合、そのメインウィンドウは多くのセカンダリウィンドウを処理します。そのコードを、ウィンドウの作成と管理に特化した別のクラスに分解することができ、それが良いデザイン(シングルトンは決して存在しない)であることはわかりません。 –

+0

@casualcoder:実際には私のアプリケーションはシステムトレイに常駐しており、ユーザーは異なる(グローバル)ホットキーによって異なるウィンドウをトリガーし、ウィンドウ間に親子関係はありません。ウィンドウは別のウィンドウ内で呼び出すことも、ホットキーで開くこともできます。それは私にそのような質問があります。 – destan

答えて

0

このような回答はまだありませんので、日々の問題に簡単な質問がありますか?これはコメントのためには長すぎるので、私は答えとして投稿しますが、他の誰かが究極の一般啓発パターンを投稿することを期待しています;)私はいつもフィットする一般的なパターンを持っていればいいと思う。

とにかく、それはすべてのウィンドウと非常に強い結合を作成するので、私はすべてをWindowManager "シングルトン"に入れません。このクラスはすべての複雑なルールを含んでいるので非常に大きくなるかもしれません(あなたは "現実世界のアプリケーション"と言います - 単一のクラスで扱われる100個のウィンドウを想像してください)。 1つの部分の変更が意図せず他の部分に影響する可能性があるため、テストやエラーが発生しやすくなる可能性があります(5つのウィンドウに使用されるブールを想像してください。 WindowManagerクラスが必要であるため、あるウィンドウを他の場所(他のプログラムのように、または同じプログラムの別の部分)に再利用しないようにすることができます。他のすべてのウィンドウをドラッグするので、この1つのウィンドウが別の場所にあります。

私は、ウィンドウの論理グループを作成し、いくつかの小さなコントローラとのやりとりを処理しようとします。おそらく、MVCパターンを調べたいと思うかもしれません。モデルをどのように操作するか、およびユーザの入力に応じてどのようなビューを表示するかをコントローラに決定させる。

関連する問題