Qt扩展-KDDockWidgets 的使用

KDDockWidgets 的使用

  • 一、概述
  • 二、原理说明
  • 三、代码实例
    • 1. 项目简述
    • 2. 布局源码

一、概述

KDDockWidgets 的使用相对比较简单,建议直接参考 其提供的例子。

二、原理说明

在这种多窗口布局显示的使用最常用的就是这两个类, 也就是 MainWindow 和 DockWidget ;
Qt扩展-KDDockWidgets 的使用_第1张图片

在我的理解里面,MainWindow充当 DockWindow的活动区域,也相当于 DockWindow的父容器。
DockWindow 与 DockWindow 的实例的排布关系可以是并列显示的,也可以是结合拼在一起的 合并显示

DockWidget 窗口作为我们业务逻辑的 容器窗口,这个只是作为Dock功能的一个容器,本质上不会影响业务。

  • 并列显示
    并列显示就是使用者经常会使用的窗口会长时间打开来看
    Qt扩展-KDDockWidgets 的使用_第2张图片
  • 合并显示
    合并显示则是有些显示窗口并不是用户认为非常的,可以放在一起让,自己切换着来看的。
    Qt扩展-KDDockWidgets 的使用_第3张图片
    在实际使用过程中,窗口可能需要关闭或者隐藏,这个框架同样给我们提供了对应的接口,即便是我们关闭了窗口,后面也是有入口调出之前关闭的窗口的。

最后一个常用的便是 用户自己排列了这些窗口的布局,希望下次再打开的时候按照之前的排列顺序给排布好,这个框架也是提供了保存布局情况的接口,非常容易使用的。也比较简单。

三、代码实例

Qt扩展-KDDockWidgets 的使用_第4张图片

上面是用KDDockWidgets 实现的一个类似 qt creator 的编辑器的框架

1. 项目简述

WorkBenchDock 就是左侧工作栏的 Dock 窗口,目的就是 来容纳 WorkBenchWD ,具体的业务逻辑实现其实放置于 WorkBenchWD 中的。

    // 主Dock 窗口
    KDDockWidgets::MainWindow *DockMainWindow;

    //Dock 窗口
    KDDockWidgets::DockWidget *WorkBenchDock;
    KDDockWidgets::DockWidget *QuestionDock;
    KDDockWidgets::DockWidget *SearchDock;
    KDDockWidgets::DockWidget *EditorDock;
    
    // Dock 窗口中实际使用的控件
    WorkBenchWG *WorkBenchWD;
    SearchWG  * SearchWD;
    QuestionWG * QuestionWD;
    EditorWG * EditorWD;

2. 布局源码

  • MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#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:
    void InitWidget();
    void InitLayout();
    void InitMenu();

private:
    Ui::MainWindow *ui;
    
    // 主Dock 窗口
    KDDockWidgets::MainWindow *DockMainWindow;

    //Dock 窗口
    KDDockWidgets::DockWidget *WorkBenchDock;
    KDDockWidgets::DockWidget *QuestionDock;
    KDDockWidgets::DockWidget *SearchDock;
    KDDockWidgets::DockWidget *EditorDock;
    
    // Dock 窗口中实际使用的控件
    WorkBenchWG *WorkBenchWD;
    SearchWG  * SearchWD;
    QuestionWG * QuestionWD;
    EditorWG * EditorWD;
};
#endif // MAINWINDOW_H
  • MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    InitWidget();

    InitLayout();

    InitMenu();
}

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

void MainWindow::InitWidget()
{
    DockMainWindow = new KDDockWidgets::MainWindow("DOCKMAINWINDOW");
    WorkBenchDock = new KDDockWidgets::DockWidget("WORKBENCH");
    WorkBenchDock->setMaximumWidth(300);
    WorkBenchDock->setMinimumWidth(120);
    WorkBenchDock->setTitle(tr("项目"));

    QuestionDock = new KDDockWidgets::DockWidget("QUESTIONDOCK");
    QuestionDock->setTitle(tr("问题"));
    QuestionDock->setMaximumWidth(600);

    SearchDock = new KDDockWidgets::DockWidget("SEARCHDOCK");
    SearchDock->setTitle(tr("搜索"));

    EditorDock = new KDDockWidgets::DockWidget("EDITORDOCK");
    EditorDock->setTitle(tr("编辑器"));

    WorkBenchWD = new WorkBenchWG;
    SearchWD = new SearchWG;
    QuestionWD=  new QuestionWG;
    EditorWD = new EditorWG;

    WorkBenchDock->setWidget(WorkBenchWD);
    SearchDock->setWidget(SearchWD);
    QuestionDock->setWidget(QuestionWD);
    EditorDock->setWidget(EditorWD);
}

void MainWindow::InitLayout()
{
    this->setCentralWidget(DockMainWindow);
    DockMainWindow->addDockWidget(EditorDock, KDDockWidgets::Location_OnRight);
    DockMainWindow->addDockWidget(SearchDock, KDDockWidgets::Location_OnBottom);
    DockMainWindow->addDockWidget(WorkBenchDock, KDDockWidgets::Location_OnLeft);

    SearchDock->addDockWidgetAsTab(QuestionDock);
}

void MainWindow::InitMenu()
{
    ui->DisplayMenu->addAction(WorkBenchDock->toggleAction());
    ui->DisplayMenu->addAction(QuestionDock->toggleAction());
    ui->DisplayMenu->addAction(SearchDock->toggleAction());
    ui->DisplayMenu->addAction(EditorDock->toggleAction());

    //保存当前布局
    QAction *SaveLayoutAction = new QAction("保存布局", ui->LayoutMenu);
    connect(SaveLayoutAction, &QAction::triggered, [=]()
      {
           KDDockWidgets::LayoutSaver saver;
           const bool result = saver.saveToFile(QStringLiteral("mylayout.json"));
      });

    QAction *LoadLayoutAction = new QAction("加载布局", ui->LayoutMenu);
    connect(LoadLayoutAction, &QAction::triggered, [=]()
      {
        KDDockWidgets::RestoreOptions options = KDDockWidgets::RestoreOption_None;

        options |= KDDockWidgets::RestoreOption_RelativeToMainWindow;

        KDDockWidgets::LayoutSaver saver(options);
        saver.restoreFromFile(QStringLiteral("mylayout.json"));
      });

    ui->LayoutMenu->addAction(SaveLayoutAction);
    ui->LayoutMenu->addAction(LoadLayoutAction);
}

若需要全部源码,评论区给我留言即可

你可能感兴趣的:(#,▶,Qt扫盲,KDDockWidgets,KDDockWidgets使用,Dock使用,qt5,布局器)