添加新的 DockWidget 后自动将 DockWidget 的大小调整为相同的高度

Automatically resize DockWidgets to same heights after adding a new DockWidget

我目前正在编写一个小应用程序,允许用户自由定义绘图。当前解决方案使用 QDockWidget,以便用户可以根据需要调整大小和重新排列绘图。

我对这个解决方案很满意,但仍有一个缺点。如果用户向已经定义的 QDockWidget 添加一个新的 QDockWidget ,一个好的行为是调整所有 QDockWidget 的大小以具有相同的高度。

以下代码说明了我正在努力实现的目标。

#include <QtGui>
#include <QMainWindow>
#include <QDockWidget>
#include <QLabel>
#include <QApplication>
#include <QAction>
#include <QMenuBar>

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

    auto window = new QMainWindow;
    auto label = new QLabel("Central Widget");
    label->hide();
    window->setCentralWidget(label);
    window->setDockNestingEnabled(true);
    for (int i = 1; i < 3; i++) {
        auto dock = new QDockWidget(QString("Plot %1").arg(i));
        dock->setWidget(new QLabel(QString("Plot %1").arg(i)));
        window->addDockWidget(Qt::LeftDockWidgetArea, dock);
    }
    window->setFixedSize(QSize(300, 600));
    window->show();

    // User presses a button and the following would get executed!
    auto dock = new QDockWidget(QString("New Plot"));
    dock->setWidget(new QLabel(QString("New Plot")));
    window->addDockWidget(Qt::LeftDockWidgetArea, dock);
    return app.exec();
}

遗憾的是,新添加的地块面积很小,而另外两个地块仍然很大。

在我手动调整停靠小部件的大小后,所需的行为应该是这样的。

我怎样才能用最少的额外工作实现这种行为?我真的必须手动调整所有 QDockWidget 的大小吗?

发生这种情况是因为您没有为 QDockWidgets 定义任何最小大小。所以如果你想要你的第三个停靠小部件应该是相同的大小。将其最小高度设置为总 window 大小的 1/3,如下所示:

dock->setMinimumHeight(window->height()/3); //! This is the third dock widget

我通过使用 Qt 5.6 附带的新功能(专门用于此用例)在我的对接系统中做了同样的事情:

void QMainWindow::resizeDocks(const QList<QDockWidget *> &docks, 
                              const QList<int> &sizes, 
                              Qt::Orientation orientation)

http://doc.qt.io/qt-5/qmainwindow.html#resizeDocks