跳转到帖子
登录关注  
墨香年少

Qt使用QDockWidget创建VS界面

已推荐帖子

首先看效果图

vs.png

 

项目结构:

project.png

 

vs.h:

#ifndef VS_H
#define VS_H

#include <QMainWindow>
#include <QAction>
#include <QLabel>
#include <QResizeEvent>
#include <QToolBar>

QT_BEGIN_NAMESPACE
namespace Ui { class VS; }
QT_END_NAMESPACE

class VS : public QMainWindow
{
    Q_OBJECT

public:
    VS(QWidget *parent = nullptr);
    ~VS();

    void initStatusBar();
    void initActionBar();
    void initDock();
    void resizeEvent(QResizeEvent *) override;
private:
    Ui::VS *ui;
    QWidget* statusBar; //状态栏
    QWidget* actionBar;    //动作栏
    QWidget* body;
    QWidget* widget_left;
    QWidget* widget_right;
    QWidget* wapper;
    QWidget* output;
    QWidget* errors;

    QDockWidget *dockTop;
    QDockWidget *dockLeft;
    QDockWidget *dockRight;
    QDockWidget *dockMain;
    QDockWidget *dockOutput;
    QDockWidget *dockErrors;

    QList<QDockWidget*> dockList;
    QList<int> widthList;

    QList<QDockWidget*> dockList2;
    QList<int> heightList;

private slots:
    void setActiveDock(bool);
};
#endif // VS_H

vs.cpp:

#include "vs.h"
#include "ui_vs.h"

#include <QDockWidget>
#include <QDebug>

VS::VS(QWidget *parent) : QMainWindow(parent) , ui(new Ui::VS)
{
    ui->setupUi(this);
    this->setMinimumSize(1200,800);
    this->setStyleSheet("font-size:14px;font-family: \"Microsoft Yahei\";");

    //删除默认窗体
    QWidget* centralWidget = takeCentralWidget();
    if(centralWidget)
    {
        delete centralWidget;
    }

    this->initActionBar();
    this->initStatusBar();

    //允许嵌套dock
    setDockNestingEnabled(true);

    body = new QWidget(this);
    body->setObjectName("body");
    body->setStyleSheet("#body{background:#EEEEF2;}");
    body->resize(this->width(),this->height() - ui->menubar->height() - statusBar->height() - actionBar->height());
    body->move(0,ui->menubar->height() + actionBar->height());

    this->initDock();
}

VS::~VS()
{
    delete ui;
}

//初始化状态栏
void VS::initStatusBar()
{
    statusBar = new QWidget(this);
    statusBar->setObjectName("statusBar");
    statusBar->setStyleSheet("#statusBar{background:#2b579a;color:#fff;}");
    statusBar->resize(this->width(),26);
    statusBar->move(0,this->height() - 26);

    QLabel* label_copy = new QLabel(statusBar);
    label_copy->setObjectName("label_copy");
    label_copy->setStyleSheet("#label_copy{color:#fff;background:#2b579a;}");
    label_copy->setText("版权所有");
    label_copy->show();
}

//初始化动作
void VS::initActionBar()
{
    actionBar = new QWidget(this);
    actionBar->setObjectName("actionBar");
    actionBar->setStyleSheet("#actionBar{background:#EEEEF2;}");
    actionBar->resize(this->width(),26);
    actionBar->setFixedHeight(26);
    actionBar->setMaximumHeight(26);
    actionBar->move(0,ui->menubar->height());

    QLabel* ico_left = new QLabel(actionBar);
    ico_left->setStyleSheet("background:transparent;");
    ico_left->setPixmap(QPixmap::fromImage(QImage(":/Resources/icon/SelectAll_32x32.png")));
    ico_left->resize(18,18);
    ico_left->setScaledContents(true);
    ico_left->move(5,4);
    ico_left->show();

    QLabel* ico_right = new QLabel(actionBar);
    ico_right->setStyleSheet("background:transparent;");
    ico_right->setPixmap(QPixmap::fromImage(QImage(":/Resources/icon/InsertSheetRows_32x32.png")));
    ico_right->resize(18,18);
    ico_right->setScaledContents(true);
    ico_right->move(ico_left->x() + ico_left->width() + 5,4);
    ico_right->show();

    QLabel* ico_resume = new QLabel(actionBar);
    ico_resume->setStyleSheet("background:transparent;");
    ico_resume->setPixmap(QPixmap::fromImage(QImage(":/Resources/icon/InsertTable_32x32.png")));
    ico_resume->resize(18,18);
    ico_resume->setScaledContents(true);
    ico_resume->move(ico_right->x() + ico_right->width() + 5,4);
    ico_resume->show();

    QLabel* ico_save = new QLabel(actionBar);
    ico_save->setStyleSheet("background:transparent;");
    ico_save->setPixmap(QPixmap::fromImage(QImage(":/Resources/icon/OptionsPivotTable_32x32.png")));
    ico_save->resize(18,18);
    ico_save->setScaledContents(true);
    ico_save->move(ico_resume->x() + ico_resume->width() + 5,4);
    ico_save->show();
}

void VS::initDock()
{
    widget_left = new QWidget(body);
    widget_left->setObjectName("widget_left");
    widget_left->setStyleSheet("#widget_left{background:#F5F5F5;border:1px solid #DDDEE6;}");

    widget_right = new QWidget(body);
    widget_right->setObjectName("widget_right");
    widget_right->setStyleSheet("#widget_right{background:#F5F5F5;border:1px solid #DDDEE6;}");
    //widget_right->setMinimumWidth(40);
    //widget_right->setMaximumWidth(240);

    wapper = new QWidget(body);
    wapper->setObjectName("wapper");
    wapper->setStyleSheet("#wapper{background:#F5F5F5;border:1px solid #DDDEE6;}");

    output = new QWidget(body);
    output->setObjectName("output");
    output->setStyleSheet("#output{background:#fff;border:1px solid #DDDEE6;}");
    output->show();

    errors = new QWidget(body);
    errors->setObjectName("errors");
    errors->setStyleSheet("#errors{background:#fff;border:1px solid #DDDEE6;}");
    errors->show();

    dockTop = new QDockWidget(tr("Dock top"), this);
    dockTop->setWidget(actionBar);
    dockTop->setAllowedAreas(Qt::TopDockWidgetArea);

    //隐藏头部
    QWidget* lTitleBar = dockTop->titleBarWidget();
    QWidget* lEmptyWidget = new QWidget();
    dockTop->setTitleBarWidget(lEmptyWidget);
    delete lTitleBar;

    addDockWidget(Qt::TopDockWidgetArea, dockTop);

    dockLeft = new QDockWidget("工具栏", this);
    dockLeft->setObjectName("dockLeft");
    dockLeft->setWidget(widget_left);
    addDockWidget(Qt::LeftDockWidgetArea, dockLeft);
    dockLeft->setStyleSheet("#dockLeft::title{background:#EEEEF2;border:1px solid #DDDEE6;}");

    dockRight = new QDockWidget("资源管理器", this);
    dockRight->setWidget(widget_right);
    dockRight->setObjectName("dockRight");
    dockRight->setStyleSheet("#dockRight::title{background:#EEEEF2;border:1px solid #DDDEE6;}");

    dockMain = new QDockWidget(tr("Dock wapper"), this);
    dockMain->setWidget(wapper);
    QWidget* dockMainTitleBar = dockMain->titleBarWidget();
    QWidget* _dockMainTitleBar = new QWidget();
    dockMain->setTitleBarWidget(_dockMainTitleBar);
    delete dockMainTitleBar;

    dockOutput = new QDockWidget("输出", this);
    dockOutput->setWidget(output);
    dockOutput->setObjectName("dockOutput");
    dockOutput->setStyleSheet("#dockOutput::title{background:#2b579a;}");

    dockErrors = new QDockWidget("错误列表", this);
    dockErrors->setWidget(errors);
    dockErrors->setObjectName("dockErrors");
    dockErrors->setStyleSheet("#dockErrors::title{background:#2b579a;}");

    splitDockWidget(dockTop,dockLeft,Qt::Vertical);
    splitDockWidget(dockLeft,dockMain,Qt::Horizontal);
    splitDockWidget(dockMain,dockRight,Qt::Horizontal);
    splitDockWidget(dockMain,dockOutput,Qt::Vertical);
    tabifyDockWidget(dockOutput,dockErrors);
    dockOutput->raise();

    dockList << dockLeft << dockMain << dockRight;
    widthList << static_cast<int>(this->geometry().width() * 0.15)
              << static_cast<int>(this->geometry().width() * 0.6)
              << static_cast<int>(this->geometry().width() * 0.25);

    dockList2 << dockMain << dockOutput;
    heightList << static_cast<int>(body->height() * 0.6)
               << static_cast<int>(body->height() * 0.4);

    this->resizeDocks(dockList, widthList, Qt::Horizontal);
    this->resizeDocks(dockList2, heightList, Qt::Vertical);

    connect(dockOutput,&QDockWidget::visibilityChanged,this,[=](bool v){
        if(v)
        {
            dockOutput->raise();
        }
    });
    connect(dockErrors,&QDockWidget::visibilityChanged,this,[=](bool v){
        if(v)
        {
            dockErrors->raise();
        }
    });
}

void VS::resizeEvent(QResizeEvent *)
{
    actionBar->resize(this->width(),26);

    statusBar->resize(this->width(),26);
    statusBar->move(0,this->height() - 26);

    body->resize(this->width(),this->height() - ui->menubar->height() - statusBar->height() - actionBar->height());
    body->move(0,ui->menubar->height() + actionBar->height());
}

void VS::setActiveDock(bool)
{
}

 


目之所及,皆是回忆,心之所想,皆是过往

分享这篇帖子


链接帖子
分享到其他站点

优化版

qdockwidget_vs_v2.png

 

vs.h

#ifndef VS_H
#define VS_H

#include <QMainWindow>
#include <QAction>
#include <QLabel>
#include <QResizeEvent>
#include <QToolBar>
#include <QDockWidget>
#include "Label.h"
#include <QStatusBar>

QT_BEGIN_NAMESPACE
namespace Ui { class VS; }
QT_END_NAMESPACE

class VS : public QMainWindow
{
    Q_OBJECT

public:
    VS(QWidget *parent = nullptr);
    ~VS();
    void initDock();
    void resizeEvent(QResizeEvent *) override;
private:
    Ui::VS *ui;

    QStatusBar* statusBar;

    QWidget* dw_top;    //上
    QWidget* dw_bottom; //下
    QWidget* dw_left;   //左
    QWidget* dw_right;  //右
    QWidget* dw_main;      //主窗体
    QWidget* dw_window;    //window
    QWidget* dw_output;    //输出日志
    QWidget* dw_errorList; //错误列表
    QWidget* dw_propty;    //属性
    QWidget* dw_res;       //资源管理器

    QDockWidget *dockTop;
    QDockWidget *dockLeft;
    QDockWidget *dockRight;
    QDockWidget *dockFoot;
    QDockWidget *dockMain;
    QDockWidget *dockWindow;
    QDockWidget *dockErrorList;
    QDockWidget *dockOutput;
    QDockWidget* dockPropty;
    QDockWidget* dockRes;

    QList<QDockWidget*> WDockList;
    QList<int> widthList;

    QList<QDockWidget*> HDockList;
    QList<int> heightList;


};
#endif // VS_H

vs.cpp

#include "vs.h"
#include "ui_vs.h"

#include <QDockWidget>
#include <QDebug>

VS::VS(QWidget *parent) : QMainWindow(parent) , ui(new Ui::VS)
{
    ui->setupUi(this);
    this->setStyleSheet("#VS{font-family: \"Microsoft Yahei\";}QLabel{font-family: \"Microsoft Yahei\";font-size:14px;}");

    //删除默认窗体
    QWidget* centralWidget = takeCentralWidget();
    if(centralWidget)
    {
        delete centralWidget;
    }

    //允许嵌套dock
    setDockNestingEnabled(true);

    statusBar = new QStatusBar(this);
    statusBar->setObjectName("statusBar");
    statusBar->setStyleSheet("#statusBar{background:red;}");
    statusBar->show();

    this->setStatusBar(statusBar);

    this->initDock();
}

VS::~VS()
{
    delete ui;
}

void VS::initDock()
{
    /*dw_top = new QWidget(this);
    dw_top->setObjectName("dw_top");
    dw_top->setStyleSheet("#dw_top{background:red;}");
    dw_top->show();

    dw_bottom = new QWidget(this);
    dw_bottom->setObjectName("dw_bottom");
    dw_bottom->setStyleSheet("#dw_bottom{background:green;}");
    dw_bottom->show();*/

    dw_left = new QWidget(this);
    dw_left->setObjectName("dw_left");
    dw_left->setStyleSheet("#dw_left{background:yellow;}");
    dw_left->show();

    dw_right = new QWidget(this);
    dw_right->setObjectName("dw_right");
    dw_right->setStyleSheet("#dw_right{background:#0078d4;}");
    dw_right->show();

    dw_main = new QWidget(this);
    dw_main->setObjectName("dw_main");
    dw_main->setStyleSheet("#dw_main{background:gray;}");
    dw_main->show();

    dw_propty = new QWidget(this);
    dw_propty->setObjectName("dw_propty");
    dw_propty->setStyleSheet("#dw_propty{background:#742774;}");
    dw_propty->show();

    dw_res = new QWidget(this);
    dw_res->setObjectName("dw_res");
    dw_res->setStyleSheet("#dw_res{background:#d83b01;}");
    dw_res->show();

    dw_window = new QWidget(this);
    dw_window->setObjectName("dw_window");
    dw_window->setStyleSheet("#dw_window{background:#008272;}");
    dw_window->show();

    dw_output = new QWidget(this);
    dw_output->setObjectName("dw_output");
    dw_output->setStyleSheet("#dw_output{background:#a4373a;}");
    dw_output->show();

    dw_errorList = new QWidget(this);
    dw_errorList->setObjectName("dw_errorList");
    dw_errorList->setStyleSheet("#dw_errorList{background:#217346;}");
    dw_errorList->show();

    //QWidget* window;    //window
    //QWidget* output;    //输出日志
    //QWidget* errorList; //错误列表

    //dockTop = new QDockWidget("top",this);
    //dockTop->setWidget(dw_top);

    dockLeft = new QDockWidget("工具箱",this);
    dockLeft->setWidget(dw_left);

    dockMain = new QDockWidget("main",this);
    dockMain->setWidget(dw_main);

    dockRight = new QDockWidget("解决方案管理器",this);
    dockRight->setWidget(dw_right);

    //dockFoot = new QDockWidget("foot",this);
    //dockFoot->setWidget(dw_bottom);

    dockPropty = new QDockWidget("属性",this);
    dockPropty->setWidget(dw_propty);

    dockRes = new QDockWidget("资源",this);
    dockRes->setWidget(dw_res);

    dockWindow = new QDockWidget("消息监视器",this);
    dockWindow->setWidget(dw_window);

    dockErrorList = new QDockWidget("错误列表",this);
    dockErrorList->setWidget(dw_errorList);

    dockOutput = new QDockWidget("消息输出",this);
    dockOutput->setWidget(dw_output);

    //addDockWidget(Qt::TopDockWidgetArea,dockTop);
    addDockWidget(Qt::LeftDockWidgetArea,dockLeft);
    addDockWidget(Qt::RightDockWidgetArea,dockRight);
    //addDockWidget(Qt::BottomDockWidgetArea,dockFoot);

    splitDockWidget(dockLeft,dockMain,Qt::Horizontal);
    splitDockWidget(dockMain,dockRight,Qt::Horizontal);
    splitDockWidget(dockRight,dockPropty,Qt::Vertical);
    splitDockWidget(dockMain,dockWindow,Qt::Vertical);

    tabifyDockWidget(dockRight,dockRes);
    tabifyDockWidget(dockWindow,dockErrorList);
    tabifyDockWidget(dockErrorList,dockOutput);
    dockRight->raise();
    dockWindow->raise();

    WDockList << dockLeft << dockMain << dockRight;
    widthList << static_cast<int>(this->geometry().width() * 0.1)
              << static_cast<int>(this->geometry().width() * 0.7)
              << static_cast<int>(this->geometry().width() * 0.2);
    this->resizeDocks(WDockList, widthList, Qt::Horizontal);

    //重置内容窗体和消息输出窗体的高度比例
    HDockList << dockMain << dockWindow;
    heightList << static_cast<int>(this->geometry().height() * 0.85)
               << static_cast<int>(this->geometry().height() * 0.15);
    this->resizeDocks(HDockList, heightList, Qt::Vertical);
}

void VS::resizeEvent(QResizeEvent *)
{
}

源码下载:

VsDemo的副本.zip


目之所及,皆是回忆,心之所想,皆是过往

分享这篇帖子


链接帖子
分享到其他站点

创建帐户或登录来提出意见

你需要成为会员才能提出意见

创建帐户

注册成为会员。只要几个简单步骤!

注册帐户

登录

已有帐户? 请登录。

现在登录
登录关注  

×
×
  • 创建新的...

重要信息

注册必须使用2-8个中文汉字作为账号