我目前正在编写一个小应用程序,允许用户自由定义绘图。当前解决方案使用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();
}
不幸的是,新添加的地块尺寸非常小,而其他两个地块仍然很大。
在我手动调整Dock小部件的大小后,所需的行为应该是这样的。
如何以最少的额外工作实现此行为?我是否真的必须手动调整所有QDockWidgets的大小?
答案 0 :(得分:1)
我在Docking系统中做了同样的事情,使用了Qt 5.6附带的新功能(完全针对这个用例):
void QMainWindow::resizeDocks(const QList<QDockWidget *> &docks,
const QList<int> &sizes,
Qt::Orientation orientation)
答案 1 :(得分:0)
这种情况正在发生,因为您尚未为QDockWidgets
定义任何最小尺寸。因此,如果您希望第三个停靠窗口小部件的大小相同。将其最小高度设置为总窗口大小的1/3,如下所示:
dock->setMinimumHeight(window->height()/3); //! This is the third dock widget