本人最近在学习C++的相关知识,在使用Qt开发时想创建一种类似于Visual Studio的布局格式,有幸在CSDN搜到了一位大佬写的关于QDockWidget的布局教程
Qt之QDockWidget嵌套布局详解-实现Visual Studio布局
下面来分享下我的关于QDockWidget的布局案例
Qt版本:6.3.0
1、首先在.ui文件,在menuBar下创建一个名为View的menu。
2、代码部分如下:
头文件:
//.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QDockWidget *dock_DataBase;
QDockWidget *dock_3DModel;
QDockWidget *dock_MapGIS;
QDockWidget *dock_Tool;
QDockWidget *dock_Center;
QDockWidget *dock_Earth;
QDockWidget *dock_2DModel;
QDockWidget *dock_3DRendering;
QDockWidget *dock_ContentView;
};
#endif // MAINWINDOW_H
cpp文件:
//.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//删除中央窗体
QWidget *p = takeCentralWidget();
if(p){
delete p;
}
//允许嵌套
setDockNestingEnabled(true);
//创建dock窗口
dock_DataBase = new QDockWidget("基础数据",this);
//设置窗口颜色,便于分辨
QPalette p1;
p1.setColor(QPalette::Window, Qt::darkGreen);
dock_DataBase->setAutoFillBackground(true);
dock_DataBase->setPalette(p1);
ui->View->addAction(dock_DataBase->toggleViewAction());//添加到菜单栏 隐藏/显示
dock_3DModel = new QDockWidget("三维模型",this);
ui->View->addAction(dock_3DModel->toggleViewAction());
dock_MapGIS = new QDockWidget("MapGIS",this);
ui->View->addAction(dock_MapGIS->toggleViewAction());
dock_Center = new QDockWidget("Center窗口",this);
//设置窗口颜色,便于分辨
QPalette p2;
p2.setColor(QPalette::Window, Qt::gray);
dock_Center->setAutoFillBackground(true);
dock_Center->setPalette(p2);
ui->View->addAction(dock_Center->toggleViewAction());
dock_Tool = new QDockWidget("Tool工具箱",this);
//设置窗口颜色,便于分辨
QPalette p3;
p3.setColor(QPalette::Window,Qt::darkCyan);
dock_Tool->setAutoFillBackground(true);
dock_Tool->setPalette(p3);
ui->View->addAction(dock_Tool->toggleViewAction());
dock_2DModel = new QDockWidget("二维视图",this);
ui->View->addAction(dock_2DModel->toggleViewAction());
dock_3DRendering = new QDockWidget("三维渲染视图",this);
ui->View->addAction(dock_3DRendering->toggleViewAction());
dock_ContentView = new QDockWidget("内容视图",this);
ui->View->addAction(dock_ContentView->toggleViewAction());
//指定中心窗口
// setCentralWidget(dock_Center);
//进行布局(先定位一个窗口,然后在进行分割,最后进行各个窗口合并)
addDockWidget(Qt::LeftDockWidgetArea,dock_DataBase);//定位"基础数据"窗口,在左侧
splitDockWidget(dock_DataBase,dock_Center,Qt::Horizontal);//将"数据窗口"和"中心窗口"水平分割
splitDockWidget(dock_Center,dock_Tool,Qt::Horizontal);//将"中心窗口"和"工具箱窗口"水平分割
tabifyDockWidget(dock_DataBase,dock_3DModel);//合并窗口
tabifyDockWidget(dock_3DModel,dock_MapGIS);//合并窗口
tabifyDockWidget(dock_Center,dock_2DModel);//合并窗口
tabifyDockWidget(dock_2DModel,dock_3DRendering);//合并窗口
tabifyDockWidget(dock_3DRendering,dock_ContentView);//合并窗口
dock_DataBase->raise();//将"基础数据"窗口进行默认显示
dock_Center->raise();//将"Center窗口"窗口进行默认显示
//设置初始化 DataBase/Center/Tool三个窗口的水平方向 大小比例
QList<QDockWidget*> temp_docklist;
temp_docklist << dock_DataBase;
temp_docklist << dock_Center;
temp_docklist << dock_Tool;
QList<int> temp_sizelist;
temp_sizelist<< static_cast<int>(this->geometry().width() * 0.2);
temp_sizelist<< static_cast<int>(this->geometry().width() * 0.6);
temp_sizelist<< static_cast<int>(this->geometry().width() * 0.2);
this->resizeDocks(temp_docklist, temp_sizelist, Qt::Horizontal);
}
MainWindow::~MainWindow()
{
delete ui;
}