Qt开发技巧(4)Advanced Docking System使用方法

目录

1.ads简介

1.1优点

1.2特性

1.3应用场景

2.下载与编译

3.创建工程

4.效果

5.传送门


1.ads简介

        Qt自带的铆接部件是QDockWidget,也被称为浮动窗口部件。QDockWidget可以用来创建可停靠的面板,它能够与QMainWindow、QDialog或任何具有centralWidget的QMainWindow派生类进行连接。QDockWidget提供了一个框架,允许用户将内容面板放置在主窗口的边缘,也可以将内容面板停靠在另一个内容面板上。即便如此,它也有很多局限性,这个继承自Qwidget的类并没有提供给用户更多的操作空间。于是开源开发者开发了一个名为ads的库(Qt-Advanced-Docking-System),提供了更多自定义的空间,也提供了更多美丽控件的可能性,方便使用。

1.1优点

  1. 高度可配置:支持多种布局模式,如水平、垂直或自由浮动,可以根据应用需求进行灵活调整。
  2. 模块化设计:模块化的实现使得代码结构清晰,易于理解和维护,开发者可以根据需要选择引入特定的功能模块,避免无谓的性能开销。
  3. 兼容性与扩展性:兼容Qt4及更高版本,支持Qt Quick(QML)。提供了丰富的API接口,方便进行功能扩展和第三方插件集成。
  4. 良好的文档和支持:配备详尽的API文档和示例代码,帮助快速上手。社区活跃,可以得到及时的技术支持和反馈。

1.2特性

  1. 自定义能力强:开发者可以根据需求调整dock工具条的外观和行为,支持多种布局模式和拖放操作。
  2. 多级折叠:支持多层嵌套的dock区域,让复杂的应用界面也能保持整洁。
  3. 动态重布局:当窗口大小变化时,自动调整dock区域的布局,确保最佳的显示效果。
  4. 可序列化:支持保存和加载dock状态,用户可以在启动时恢复上次的工作环境。
  5. 支持多种交互方式:如分割器(Splitter)支持两种拖动交互方式,以满足不同用户的使用习惯。

1.3应用场景

Qt Advanced Docking System广泛适用于各种需要复杂界面布局和交互的桌面应用,特别是以下场景:

  1. 集成开发环境(IDEs):如Microsoft Visual Studio等,需要动态调整、自由组合的窗口面板,以提升用户的工作效率。
  2. 图像处理软件:复杂的图像处理流程需要多窗口、多面板的协同工作,Qt Advanced Docking System可以很好地满足这种需求。
  3. 数据分析工具:在数据分析过程中,用户可能需要同时查看多个数据集或图表,Qt Advanced Docking System可以帮助用户轻松管理这些窗口和面板。
  4. 多任务操作窗口:需要用户进行多任务操作的场景中,Qt Advanced Docking System可以创建自定义的布局和停靠功能,帮助用户更好地组织和管理工作窗口。

2.下载与编译

       可以在Github上搜索下载,本文也将提供了下载链接。

①删除user后缀文件,打开ads.pro文件

②编译,这是一个多项目工程,demo与examples一共提供了7个示例工程,方便用户参考。Src文件则是ads库的源代码,右键选择build。

③在构建目录中,看到在本地编译环境下生成的库文件。

④新建一个工程,把ads工程的所有头文件放在新建工程的工程目录下

⑤在新工程中添加外部库

3.创建工程

在这个小场景中,提供了一些方法示例,如在dockwidget添加label部件并显示图片;提供新建窗口示例,关闭当前窗口、获取当前活跃窗口,切换窗口的示例。并处理切换窗口、关闭窗口的信号。需要说明的是,ads::CDockManager::setConfigFlag(ads::CDockManager::FocusHighlighting, true);这个属性是必要的,并且必须在m_DockManager创建实例之前调用,否则程序会出现意外。另外,这个库设计很多类来完成窗口拖动等等功能,用到上看啥即可。

主要代码如下.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QWidgetAction>
#include <QLabel>
#include <QCalendarWidget>
#include <QTreeView>
#include <QFileSystemModel>
#include <QTableWidget>
#include <QHBoxLayout>
#include <QRadioButton>
#include <QPushButton>
#include <QInputDialog>
#include <QFileDialog>
#include <QSettings>
#include <QMessageBox>
#include <QPlainTextEdit>
#include <QToolBar>
#include "DockAreaWidget.h"
#include "DockAreaTitleBar.h"
#include "DockAreaTabBar.h"
#include "FloatingDockContainer.h"
#include "DockComponentsFactory.h"
#include "DockManager.h"
#include "DockWidgetTab.h"
#include "DockAreaTabBar.h"
using namespace ads;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QVBoxLayout* Layout = new QVBoxLayout(ui->widget);
    Layout->setContentsMargins(QMargins(0, 0, 0, 0));
    //添加一个dock管理器,作为所有dockwidget的管理者
    ads::CDockManager::setConfigFlag(ads::CDockManager::FocusHighlighting, true);//这个属性必须在创建实例之前设置
    m_DockManager = new ads::CDockManager(ui->widget);
    Layout->addWidget(m_DockManager);
    ui->widget->setLayout(Layout);
    connect(m_DockManager, &ads::CDockManager::focusedDockWidgetChanged, this,&MainWindow::handlePageChanged);

    //给m_DockManager创建一个初始窗口添加label显示图像
    ads::CDockWidget* DockWidget = new ads::CDockWidget("View0",this);
    QLabel *showLabel = new QLabel(DockWidget);
    showLabel->setWordWrap(true);
    DockWidget->setWidget(showLabel);
    QPixmap pix(":/res/show.jpg");
    pix.scaled(showLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    showLabel->setPixmap(pix);
    m_DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget);
    connect(DockWidget,&ads::CDockWidget::closed,this,&MainWindow::handleWidgetCloseBtn);
}
MainWindow::~MainWindow()
{
    delete ui;
}

//新建窗口
void MainWindow::on_pushButton_clicked()
{
    static int Count = 1;
    ads::CDockWidget* DockWidgetNew = new ads::CDockWidget(QStringLiteral("View %1").arg(Count++),this);
    m_DockManager->addDockWidgetTab(ads::CenterDockWidgetArea, DockWidgetNew);
}
//关闭当前窗口
void MainWindow::on_pushButton_2_clicked()
{
    //获取当前窗口
    ads::CDockWidget * currentDockWidget = m_DockManager->focusedDockWidget();
    if(currentDockWidget){
       currentDockWidget->closeDockWidget();
       currentDockWidget->deleteDockWidget();
    }
}
//在切换至窗口View2
void MainWindow::on_pushButton_3_clicked()
{
    ads::CDockWidget* DockWidget_New =  m_DockManager->findDockWidget("View 2");
    if(DockWidget_New==nullptr){
        return;
    }
    if(DockWidget_New->isClosed()){
        DockWidget_New->toggleView();
    }
    else{
        ads::CDockWidget* DockWidget_old =  m_DockManager->focusedDockWidget();
        if(DockWidget_old==nullptr){
            DockWidget_New->tabWidget()->setActiveTab(true);
            return;
        }
        DockWidget_old->tabWidget()->setActiveTab(false);
        DockWidget_New->tabWidget()->setActiveTab(true);
    }
}
//处理窗口切换信号
void MainWindow::handlePageChanged(ads::CDockWidget *old, ads::CDockWidget *now)
{
    qDebug()  << " CDockManager::focusedDockWidgetChanged old: " << (old ? old->objectName() : "-") << " now: " << now->objectName() << " visible: " << now->isVisible();
}
//处理窗口关闭信号
void MainWindow::handleWidgetCloseBtn()
{
    qDebug()  << " current closed";
}

4.效果

5.传送门

🎄我的主页

🎄【QT实战】汇总导航

🎄上一篇:Qt开发技巧(3)常用快捷键、添加资源文件



🎏文章原创,首发于**CSDN**论坛。 
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGArea

原创不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值