添加新的DockWidget后,自动将DockWidgets调整到相同的高度

时间:2016-06-10 07:30:14

标签: c++ qt 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();
}

不幸的是,新添加的地块尺寸非常小,而其他两个地块仍然很大。

Behavior of code

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

如何以最少的额外工作实现此行为?我是否真的必须手动调整所有QDockWidgets的大小?

2 个答案:

答案 0 :(得分:1)

我在Docking系统中做了同样的事情,使用了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

答案 1 :(得分:0)

这种情况正在发生,因为您尚未为QDockWidgets定义任何最小尺寸。因此,如果您希望第三个停靠窗口小部件的大小相同。将其最小高度设置为总窗口大小的1/3,如下所示:

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