2012-07-18 13 views
7

私たちのアプリケーションでは、実行時に読み込まれるプラグインによっていくつかのプラグインが追加されるため、さまざまな数のドッキングウィジェットがあります。すべてのドックウィジェットが必ずしも同時に表示される必要はありません。これは、ユーザーが作業しているものとアクティブなプラグインによって大きく異なります。QMainWindowであまりにも多くのドックウィジェットと醜いオーバーラップを避けるには?

addDockWidget(...)でプログラムで追加するドックウィジェットが多すぎると、タブではなく(タブではなく、明らかに壊れている別の領域にペイントされているものの内容に関して) )。

Overlapping dockwidgets

ユーザは依然として残された空間を有しているが、レイアウト/メイン・ウィンドウが正常に「混雑」dockareaに(untabbed)再添加を防止dockareas にdockwidgetsを移動させることができます。私たちは、タブ付きのドックは、ユーザーが必要なdockwidgetsを手配することを可能にすることができますが、これはあまりにも多くの(ドック面積あたりの1)を同時に表示dockwidgetsの数を制限するであろうから、我々はQMainWindow::ForceTabbedDocksを有効にしたくない。

ドックウィジェットの追加方法を制御するにはどうしたらいいですか?

答えて

5

実際にQtを忘れて、実際に相互作用がどのように機能するかを考えてみる価値があります。ユーザーの期待は何ですか? 10種類のプラグインがアクティブになると実際にどうなるでしょうか?彼らはドッキングする必要がありますか、または彼らは浮動しているか、MainWindowの端に小さなボタンとして初期状態のピンが可能なドッキングウィンドウになるはずですか? Qtがそのインターフェイスを開発するための直接的な方法を提供しているかどうかを知ることができます。開発する必要がある追加コンポーネントがない場合は、Qtを見てみましょう。そのインターフェースを動かす。

私自身の経験から、私はMFCで長い昔と同様のインターフェイスを開発しました。私たちがやったやり方は、ドッキングされた窓のいくつかが持っていなければならないとみなされ、ドッキングされたものとして登場するということでした。その後、常に表示される必要はないが、すぐに利用できるはずの一連のウィンドウがあり、その初期状態は、メインウィンドウの端にボタンとして表示されたピン配置のドッキングウィンドウであった。最後に、ユーザーが必ずしも必要とせず、ファイル - >表示メニューから呼び出すことができる3番目のセットがありました。ユーザがそれを見えるようにすると、ユーザは通常、それを最初の2つのグループのうちの1つに割り当てるか、またはそれを浮かせたままにする。この設定全体が設定ファイルに保存され、プラグインがロード/アクティブになるたびに、関連付けられたドッキングウィンドウの最後に使用された状態が使用されました。それにもかかわらず、かなりの余分な作業が必要でしたが、最終的な結果はすべてのユーザーを満足させることでした。

+1

ありがとうございます。私はこれが健全なアドバイスだと思います。これは良い例です。技術的な詳細を忘れてしまった場合には、全体的なデザインと大きな図を再考することは常に良いアイデアです。 –

2

setDockOptions(QMainWindow::AllowNestedDocks)を試しましたか?私は今それをテストすることはできませんが、それは助けるかもしれません。 あなたはあまりにも多くの問題を抱えている場合、あなたはこのことについて間違った道を進んですることができる:デフォルトでは 、QMainWindow::dockOptionsは、あなたが何か

setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks) 

などのEDITを望む AnimatedDocks | AllowTabbedDocksに設定されています。ドックを使用する代わりに、QMdiWindowでQMdiAreaを使用してみてください。これはあなたのプログラムではうまくいかないかもしれませんが、それについて考えるべきです。

+0

私は 'AllowNestedDocks'が好きかどうかはわかりませんが、これを試してみます。今のように、浮動小数点ウィジェットを移動したいときに、ドックウィジェットが異なる領域にスナップし始めるときには、すでにかなり迷惑をかけることがあります。ネスティングを有効にすると、可能なドックエリアの数が増えます。 –

+0

はい、そうです。 qtのドキュメントには、多くのドックにとっては良いことが書かれていますが、迷惑になる可能性があります。 –

+0

さらに悪いです。まず第一に、それは動作しません。ドックウィジェットの「レベル」が1つであれば、以前と同じです。しかし、もし私がお互いの隣にドックウィジェットを入れて、そのエリアに別のドックウィジェットをプログラムで追加すると**両方の入れ子になったドックウィジェットが重複するだけです:/ –

1

これは私が試したソリューションです:

  1. は、私がQTCreatorウィンドウで空のプロジェクトを作成したが、「新ドック」とDockWidgetラベルされたミニマルなメニューがdockWidget

  2. という名前ですtriggered()私のメニュー項目のハンドラ:

    void MainWindow::on_actionNew_Dock_triggered() 
    {  
        QDockWidget* w = new QDockWidget("Demo", ui->dockWidget); 
        this->addDockWidget(Qt::LeftDockWidgetArea,w); 
        this->tabifyDockWidget(ui->dockWidget,w); 
    } 
    

tabifyDockWidget(QDockWidget* first, QDockWidget* second)は、最初のドックウィジェットに第2のドックウィジェットを積み重ねるQMainWindowメソッドです。希望すると助かります...

+0

しかし、最初にドックウィジェットがあるかどうかを確認する必要がありますその面と複数のものがある場合は、どれをタブライズするかを決めます。しかし、それでも私が推測する問題は解決しないでしょう: 'LeftDockWidgetArea'に2つのドックウィジェットがあるとします。最小サイズは、使用可能なすべてのスペースを占めます。一つは小さく、一つは大きくあります。私はかなり大きなドックウィジェットを追加します。私が新しいドックウィジェットでタブダウンするように小さなものを選ぶと、全く同じ問題(2つのドックウィジェットが並んでいて、大きすぎるとQtがminimumSizeをオーバーライドして醜いオーバーラップを引き起こすのではないかと心配しています) –

+0

またはam私は何かが不足しているのでしょうか?たぶん、どのドックウィジェットを追加できるのか、いつ、どのように、どこでどのようにプロセスを再定義しなければならないのでしょうか? –

+0

プラグインレベルでタブ/ドッキングポリシーを実装できます。 'QWidget'から' 'QDockWindow''のメインウィジェットとして設定されます。この場合、共通のプラグインの祖先は、その子孫によって変更できる基本的なドッキング/位置付けポリシーを考案することができます –

関連する問題