• Qt扩展-KDDockWidgets 的使用


    一、概述

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

    二、原理说明

    在这种多窗口布局显示的使用最常用的就是这两个类, 也就是 MainWindow 和 DockWidget ;
    在这里插入图片描述

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

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

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

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

    三、代码实例

    在这里插入图片描述

    上面是用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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

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

  • 相关阅读:
    C++-Cmake指令:target_link_libraries
    c++的数据类型的引用(三种方式有一些区别)
    Spring Boot 2.6.x整合Swagger启动失败报错问题解决(治标还治本)
    修炼k8s+flink+hdfs+dlink(六:学习k8s-pod)
    Vue Router学习
    【PyTorch】2-主要组成模块(数据读入、模型构建、损失函数、评价指标、训练和测试、优化器)
    Springcloud----Nacos配置中心
    JAVA启动参数备完
    python-0007-django模版
    智能家居现状分析及未来展望
  • 原文地址:https://blog.csdn.net/qq_43680827/article/details/133271950