实际应用过程中,需要设置QDockWidget的初始化大小,每个QDockWidget所占的宽高比例,实测QDockWidget不能使用resize方法来确定初始大小,如果用setMaximumSize和setFixedSize,的确可以设置初始大小,但也限制了QDockWidget的最大尺寸,不能用鼠标拖动来改变QDockWidget的大小。
//为摘抄 Qt 程序初始化时QDockWidget大小的调整方法 - 一杯清酒邀明月 - 博客园
【在QT中对于QDockWidget的resize()方法是无效的,因为QDockWidget的大小是由其中包含的控件决定的。在manual中这样说:
A QDockWidget acts as a wrapper for its child widget, set with setWidget(). Custom size hints, minimum and maximum sizes and size policies should be implemented in the child widget. QDockWidget will respect them, adjusting its own constraints to include the frame and title. Size constraints should not be set on the QDockWidget itself, because they change depending on wether it is docked; a docked QDockWidget has no frame and a smaller title bar.
因此在程序初始化时不能简单地使用resize()等方法调整QDockWidget大小。】
所以初始化QDockWidget,只需要设置其中包含的控件的大小即可。
在QWidget工程中实现垂直方向拉伸示例:
#pragma once
#ifndef __A_WIDGET_H__
#define __A_WIDGET_H__
#include <QVBoxLayout>
#include <QWidget>
class VDockWindow;//声明
class TestWidget : public QWidget
{
Q_OBJECT
public:
TestWidget(QWidget *parent = Q_NULLPTR);
~TestWidget();
private:
void InitWidget();//初始化控件
void InitLayout();//布局
private:
QWidget* m_TopWidget;
QWidget* m_BottomWidget;
QVBoxLayout* m_vMainLayout;
VDockWindow* m_VDockWindow;
}
#endif
TestWidget::TestWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setMinimumSize(360, 360);
InitWidget();
InitLayout();
}
TestWidget::~TestWidget()
{
//释放资源
}
void TestWidget::InitWidget()
{
//
m_TopWidget = new QWidget(this);
m_TopWidget->resize(this->width(), this->height() / 10 * 9);//设置窗体显示比例
//
m_BottomWidget = new QWidget(this);
m_BottomWidget->resize(this->width(),this->height()/10*1);//设置窗体显示比例
//
m_VDockWindow = new VDockWindow(m_TopWidget, m_BottomWidget,this->height());
m_VDockWindow->takeCentralWidget();
m_VDockWindow->setContentsMargins(0, 0, 0, 0);
}
void TestWidget::InitLayout()
{
m_vMainLayout = new QVBoxLayout(this);
m_vMainLayout->addWidget(m_VDockWindow);
m_vMainLayout->setContentsMargins(0, 0, 0, 0);
}
#pragma once
#ifndef VDOCKWINDOW_H
#define VDOCKWINDOW_H
#include <qmainwindow.h>
#include "ui_VDockWindow.h"
class VDockWindow : public QMainWindow
{
public:
VDockWindow(QWidget* pRightWgt, QWidget* pLeftWgt, int nHeight);
~VDockWindow();
private:
void InitDockWindow();
private:
Ui_VDockWindow ui;
private:
int m_nHeight;
QWidget* m_pTopWgt;
QWidget* m_pBottomWgt;
QDockWidget* dockTop;
QDockWidget* dockBottom;
};
#endif // VDOCKWINDOW_H
#include "VDockWindow.h"
#include <QDockWidget>
VDockWindow::VDockWindow(QWidget* pTopWgt, QWidget* pBottomWgt, int nHeight)
: QMainWindow(NULL), m_nHeight(nHeight), m_pTopWgt(pTopWgt), m_pBottomWgt(pBottomWgt)
{
ui.setupUi(this);
InitDockWindow();
}
VDockWindow::~VDockWindow()
{
//释放资源
}
void VDockWindow::InitDockWindow()
{
dockTop = new QDockWidget(this);
QWidget* leftTitle = dockTop->titleBarWidget();
QWidget* topWidget = new QWidget();
dockTop->setTitleBarWidget(topWidget);
delete leftTitle;
dockTop->setFeatures(QDockWidget::NoDockWidgetFeatures);
dockTop->setWidget(m_pTopWgt);
addDockWidget(Qt::TopDockWidgetArea, dockTop);
dockTop->setStyleSheet("border:0px;");
dockTop->setContentsMargins(0, 0 , 0, 0);
dockBottom = new QDockWidget(this);
QWidget* rightTitle = dockBottom->titleBarWidget();
QWidget* bottomWidget = new QWidget();
dockBottom->setTitleBarWidget(bottomWidget);
delete rightTitle;
dockBottom->setFeatures(QDockWidget::NoDockWidgetFeatures);
dockBottom->setWidget(m_pBottomWgt);
addDockWidget(Qt::BottomDockWidgetArea, dockBottom);
dockBottom->setStyleSheet("border:0px;");
dockBottom->setContentsMargins(0, 0, 0, 0);
//splitDockWidget(dockLeft, dockMid, Qt::Horizontal); // 水平
splitDockWidget(dockTop, dockBottom, Qt::Vertical); //
QList<QDockWidget*> docks = { dockTop, dockBottom };
float windowHeight = m_nHeight;
//int dockLeftWidth = 0.9 * windowHeight;
//int dockRightWidth = 0.1 * windowHeight;
int dockToptWidth = m_pTopWgt->height();//获取控件实际高度
int dockBottomWidth = m_pBottomWgt->height();//获取控件实际高度
QList<int> dockSizes = { dockToptWidth, dockBottomWidth };
// 按照比例重新计算停靠窗体的宽度
resizeDocks(docks, dockSizes, Qt::Vertical);
}