2016-09-28 23 views
0

Qt 5を使用してポータブルアプリケーションを開発していますが、現在、ドックエリアに複数のQDockWidgetsを強制的に配置する方法を探しています。例えば、2つのドッキング可能なウィジェットAとBで、私は次のように動作したいと思います:QDockWidgetを強制的に実行する

  • Aがフローティングまたは左
  • Bにドッキングすると、浮動または左ではなくにドッキングすることができますすることができますいずれかのどちらか右私は順序が保存されるべきことを望む

の:ウィジェットBがユーザによってドッキングを解除し、redockedされている場合、それが唯一のウィジェットAの右側に場所を取ることができ

ですそれはどんな方法でも可能ですか?私はそのような種類の機能への参照を見つけることができません。

答えて

1

AFAIK Qtにはこの機能がありません。ドックはシグナルによって手作業で並べ替える必要があります。ここに簡単なサンプルがあります:

#include <QtCore> 
#include <QtGui> 
#include <QtWidgets> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QMainWindow mainWindow; 
    mainWindow.setCentralWidget(new QLabel("<B>I am a<BR>central widget.</B>")); 
    QDockWidget dock1("Dock1"); 
    dock1.setWidget(new QLabel("Content1")); 
    QDockWidget dock2("Dock2"); 
    dock2.setWidget(new QLabel("Content2")); 
    dock2.setAllowedAreas(Qt::LeftDockWidgetArea); 

    const auto relocateDock1 = [&] (Qt::DockWidgetArea newArea) { 
     if (dock1.isFloating()) 
      return; 

     if (newArea == Qt::LeftDockWidgetArea) { 
      // Dock is tabified before user drops it. See also 
      // QMainWindow::splitDockWidget notes in documentation. 
      if (!mainWindow.tabifiedDockWidgets(&dock2).isEmpty()) 
       mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock2); 
      mainWindow.splitDockWidget(&dock1, &dock2, Qt::Horizontal); 
     } 
    }; 
    const auto relocateDock2 = [&] (bool topLevel) { 
     if (topLevel) 
      return; 

     if (mainWindow.dockWidgetArea(&dock1) == Qt::LeftDockWidgetArea) { 
      mainWindow.splitDockWidget(&dock1, &dock2, Qt::Horizontal); 
     } 
    }; 
    QObject::connect(&dock1, &QDockWidget::dockLocationChanged, relocateDock1); 
    QObject::connect(&dock2, &QDockWidget::topLevelChanged, relocateDock2); 

    mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock1); 
    mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock2); 
    relocateDock2(false); 

    mainWindow.show(); 

    return app.exec(); 
} 

このように見えますが、回避策がたくさんあります。しかし私は良い方法を知らない。

私はそれをするのに多くの時間を費やしています。私の助言はこの考えを捨てることです。 1つのドックに2列のウィジェットを入れる方が簡単でしょうか?

+0

あなたの答えをありがとうが、それは私の質問ではなかった:私はあなたがウィジェットを並べ替えることができ、そして/またはドッキングの方向をプログラム的に強制することができることを知っている。しかし、私は注文を保存する必要があります。あなたのサンプルでは、​​ "dock2"ウィジェットがドッキング解除されていて、ユーザーによって再表示されている場合、それは "dock1"ウィジェットの右側でのみ行うことができます。 –

+0

@JLTresset質問からは分かりません。回答の編集を参照してください。あなたが望むものなら、それをコンパクトに編集します。 – ilotXXI

+0

ありがとうございます。確かにそれは動作するはずです:私は明日それをテストします。報酬。 –

関連する問題