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列のウィジェットを入れる方が簡単でしょうか?
あなたの答えをありがとうが、それは私の質問ではなかった:私はあなたがウィジェットを並べ替えることができ、そして/またはドッキングの方向をプログラム的に強制することができることを知っている。しかし、私は注文を保存する必要があります。あなたのサンプルでは、 "dock2"ウィジェットがドッキング解除されていて、ユーザーによって再表示されている場合、それは "dock1"ウィジェットの右側でのみ行うことができます。 –
@JLTresset質問からは分かりません。回答の編集を参照してください。あなたが望むものなら、それをコンパクトに編集します。 – ilotXXI
ありがとうございます。確かにそれは動作するはずです:私は明日それをテストします。報酬。 –