8

このアプリケーションでは、実行時にロードされるプラグインによって追加されるドックウィジェットがいくつかあるため、ドックウィジェットの数は可変です。すべてのドックウィジェットが必ずしも同時に表示される必要はありません。これは、ユーザーが作業しているものとアクティブなプラグインに大きく依存します。

ただし、プログラムで追加されたドックウィジェットが多すぎるとaddDockWidget(...)、互いに重なり始めます(タブではなく、別の領域にペイントされている1つのコンテンツの内容で、明らかに壊れているように見えます)。

重複するドックウィジェット

ユーザーはドックウィジェットをまだスペースが残っているドックエリアに移動できますが、レイアウト/メインウィンドウは「混雑した」ドックエリアへの再追加を正常に防止します(アブされない)。

QMainWindow::ForceTabbedDocksタブ付きドックを使用して、ユーザーが必要なドックウィジェットを配置できるようにしますが、同時に表示されるドックウィジェットの数が制限されすぎるため(ドック領域ごとに1つ)、有効にしたくありません。

これを防ぐにはどうすればよいですか、またはドックウィジェットの追加方法をより適切に制御するにはどうすればよいですか?

4

3 に答える 3

6

質問に直接答えることはありませんが、Qtを実際に忘れて、相互作用全体がどのように機能するかを実際に考えることは価値があるかもしれません。ユーザーの期待は何ですか?10個の異なるプラグインがアクティブになった場合、実際に何が起こるはずですか?それらをドッキングする必要がありますか、それともフローティングにする必要がありますか、それともメインウィンドウの端にある小さなボタンとして初期状態のピン留め可能なドッキングウィンドウにする必要がありますか?その基礎的な作業を行い、ユーザーインターフェイスのモックアップを思いついたら、Qtを調べて、Qtがそのインターフェイスを開発する直接的な方法を提供するかどうか、そうでない場合はどの追加コンポーネントを開発する必要があるかを理解できると思います。そのインターフェイスを機能させます。

From my own experience, I had developed a similar interface long back but in MFC. The way we did it was that some of the docked windows were deemed to be must have and they would come up as docked. Then there were a set of windows that didnt need to be visible always but should be quickly available and their initial state was as hidden pin-able dock window which meant they came up as buttons on the MainWindow edge. Finally there was a third set that was not required by the user always and could be called in from File->View Menu. Once the user made it visible, the user typically would assign it to one of the first two groups or keep it afloat. This whole configuration was saved in a config file and from there onwards whenever the plugin was loaded/became active the last used state of the associated docking window was used. It though involved quite a bit of extra work but the end result was to the satisfaction of all users.

于 2012-08-03T13:12:53.493 に答える
2

試しましたsetDockOptions(QMainWindow::AllowNestedDocks)か?今はテストできませんが、役立つかもしれません。デフォルトでQMainWindow::dockOptionsは、に設定されてAnimatedDocks | AllowTabbedDocksいるので、次のようなものが必要になります

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

編集:あなたがあまりにも多くの問題を抱えているならば、あなたはこれを間違った方法で行っているかもしれません。ドックを使用する代わりに、QMdiWindowでQMdiAreaを使用してみることをお勧めします。これはあなたのプログラムではうまくいかないかもしれませんが、それについて考える必要があります。

于 2012-07-31T18:47:06.693 に答える
1

これは私が試した解決策です:

  1. QTCreatorで、ウィンドウ、「New Dock」というラベルの付いた最小限のメニュー、および「NewDock」という名前の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メソッドです。それが役に立てば幸い...

于 2012-08-02T12:25:22.503 に答える