添加新的 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)
我目前正在编写一个小应用程序,允许用户自由定义绘图。当前解决方案使用 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)