Qt扩展-KDDockWidgets 的使用

news2024/11/26 6:24:52

KDDockWidgets 的使用

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

一、概述

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;

2. 布局源码

  • MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <kddockwidgets/MainWindow.h>
#include <kddockwidgets/DockWidget.h>
#include <QuestionWG.h>
#include <SearchWG.h>
#include <WorkBenchWG.h>
#include  <EditorWG.h>

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);
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No127.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

SpringBoot RestControllerAdvice异常处理适配原理

在项目中我们经常通过RestControllerAdviceExceptionHandler一起来实现全局的异常处理。 以下是示例代码&#xff1a; package com.xulu.monitor.test;import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.Rest…

【面试题】2023前端面试真题之JS篇

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 世界上只有一种真正的英雄主义&#xff0c;那就是看清生活的真相之后&#xff0c;依然热爱生活。…

Shiro反序列化原理及完整复现流程(Shiro-550/Shiro-721)

一、Shiro简介 Apache Shiro是一个强大且易用的**Java安全框架,**能够用于身份验证、授权、加密和会话管理。Shiro拥有易于理解的API,您可以快速、轻松地获得任何应用程序——从最小的移动应用程序到最大的网络和企业应用程序。 二、环境准备 靶机IP地址&#xff1a;192.168…

【新版】系统架构设计师 - 未来信息综合技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…

Facebook耐用号养成攻略!如何实现自动化高效养号

在跨境电商领域&#xff0c;Facebook 已经成为一个不可或缺的推广和营销平台。然而&#xff0c;想要在 Facebook 上取得成功&#xff0c;有一批耐用的 Facebook 账号是必不可少的。养出一批 Facebook 耐用号可以不仅可以大幅度提高推广效率&#xff0c;更能有效降低营销成本&am…

ISP图像信号处理——平场校正介绍以及C++实现

参考文章1&#xff1a;http://t.csdn.cn/h8TBy 参考文章2&#xff1a;http://t.csdn.cn/6nmsT 参考网址3&#xff1a;opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正&#xff1b;再用PRNU(Photo Response Non Uniformity)…

c++颜色空间转换

c颜色空间转换 cvtColor函数标识符颜色空间转换的类型 cvtColor函数使用不同的标识符来表示颜色空间转换的类型。这些标识符通常位于OpenCV的cv命名空间中&#xff0c;并以cv::COLOR_作为前缀。以下是一些常用的cvtColor函数标识符&#xff1a; BGR到灰度&#xff1a; cv::CO…

JEP290深入学习

关键类的学习 ObjectInputFilter serialFilter字段的类型就是ObjectInputFilter&#xff0c;这个接口是一个函数接口&#xff08;可以对方法进行赋值&#xff09;&#xff0c;其中定义的抽象方法是&#xff1a; Status checkInput(FilterInfo filterInfo); 接受的参数类型F…

JavaSE 栈和队列

目录 1 栈 Stack1.1 概念1.2 实现1.3 Stack常见方法的使用1.4 前、中、后缀表达式 2 队列 Queue2.1 概念2.2 实现2.3 循环队列2.4 双端队列 3 Java中的栈和队列4 练习题4.1 括号匹配问题4.2 用队列实现栈4.3 用栈实现队列4.4 实现一个最小栈4.5 设计循环队列 1 栈 Stack 1.1 概…

LIMS实验室信息管理系统源码 基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体

LIMS 是一个集现代化管理思想与基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体&#xff0c;以实验室业务和管理工作为核心&#xff0c;遵循实验室管理国际规范&#xff0c;实现对实验室全方位管理的信息管理系统。 LIMS将样品管理、数据管理…

前端利用策略模式优化if else

策略模式 策略模式定义了一系列算法,并将每种算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。 策略模式优化if else 策略模式可以用来代替多重if else语句。 Vue中使用策略模式 我们以一个表单验证的例子来看看如何使用策略模式优化if else。 methods:…

一文让你搞懂async/await存在时的执行顺序

最近在写项目&#xff0c;发现代码中总出现这样的内容&#xff0c;一直百思不得其解&#xff0c;后来同事说这段代码的意义是把后边的任务变成宏任务执行&#xff0c;这我更迷惑了&#xff0c;我发现自己的Promise基础还是很差&#xff0c;因此在摸索了几天后&#xff0c;感觉好…

SAP ABAP内部单位外部单位转换问题

之前没有留意&#xff0c;用户用了那么久也没有发现&#xff0c;今天用户找过来说他在前台维护的是PC&#xff0c;但是报表里面显示是ST。 看了一下原来这里的“内部度量单位”就是内部的、与语言无关的计量单位格式&#xff08;ST&#xff09;。该内部格式在输出到屏幕之前&a…

完整指南:如何使用 Node.js 复制文件

文件拷贝指的是将一个文件的数据复制到另一个文件中&#xff0c;使目标文件与源文件内容一致。Node.js 提供了文件系统模块 fs&#xff0c;通过该模块可以访问文件系统&#xff0c;实现文件操作&#xff0c;包括拷贝文件。 Node.js 中文件拷贝方法 在 Node.js 中&#xff0c;有…

竞赛选题 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

Postgresql源码(114)视图权限授予逻辑

0 速查 被授权的对象在系统表中记录授权信息&#xff0c;例如pg_namespace中的nspacl列&#xff1a; {mingjieUC/mingjie,UC/mingjie,pusr1UC/mingjie}pusr1UC/mingjie的含义&#xff1a; mingjie是赋予者pusr1是被赋予者UC是权限&#xff0c;表示USAGE和CREATE 1 视图权限…

@SpringBootApplication注解的理解——如何排除自动装配 分布式情况下如何自动加载 nacos是怎么被发现的

前言 spring作为主流的 Java Web 开发的开源框架&#xff0c;是Java 世界最为成功的框架&#xff0c;持续不断深入认识spring框架是Java程序员不变的追求。 本篇博客介绍SpringBootApplicant注解的自动加载相关内容 其他相关的Spring博客文章列表如下&#xff1a; Spring基…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy&#xff08;5.15&#xff09; ros2版本: humble 安装参考&#xff1a; Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可&#xff0c;到安装软件包的时候&#xff0c;若只为开发&#xff0…

C++中实现雪花算法来在秒级以及毫秒及时间内生成唯一id

1、雪花算法原理 雪花算法&#xff08;Snowflake Algorithm&#xff09;是一种用于生成唯一ID的算法&#xff0c;通常用于分布式系统中&#xff0c;以确保生成的ID在整个分布式系统中具有唯一性。它的名称来源于雪花的形状&#xff0c;因为生成的ID通常是64位的整数&#xff0…