目录
1.ads简介
Qt自带的铆接部件是QDockWidget,也被称为浮动窗口部件。QDockWidget可以用来创建可停靠的面板,它能够与QMainWindow、QDialog或任何具有centralWidget的QMainWindow派生类进行连接。QDockWidget提供了一个框架,允许用户将内容面板放置在主窗口的边缘,也可以将内容面板停靠在另一个内容面板上。即便如此,它也有很多局限性,这个继承自Qwidget的类并没有提供给用户更多的操作空间。于是开源开发者开发了一个名为ads的库(Qt-Advanced-Docking-System),提供了更多自定义的空间,也提供了更多美丽控件的可能性,方便使用。
1.1优点
- 高度可配置:支持多种布局模式,如水平、垂直或自由浮动,可以根据应用需求进行灵活调整。
- 模块化设计:模块化的实现使得代码结构清晰,易于理解和维护,开发者可以根据需要选择引入特定的功能模块,避免无谓的性能开销。
- 兼容性与扩展性:兼容Qt4及更高版本,支持Qt Quick(QML)。提供了丰富的API接口,方便进行功能扩展和第三方插件集成。
- 良好的文档和支持:配备详尽的API文档和示例代码,帮助快速上手。社区活跃,可以得到及时的技术支持和反馈。
1.2特性
- 自定义能力强:开发者可以根据需求调整dock工具条的外观和行为,支持多种布局模式和拖放操作。
- 多级折叠:支持多层嵌套的dock区域,让复杂的应用界面也能保持整洁。
- 动态重布局:当窗口大小变化时,自动调整dock区域的布局,确保最佳的显示效果。
- 可序列化:支持保存和加载dock状态,用户可以在启动时恢复上次的工作环境。
- 支持多种交互方式:如分割器(Splitter)支持两种拖动交互方式,以满足不同用户的使用习惯。
1.3应用场景
Qt Advanced Docking System广泛适用于各种需要复杂界面布局和交互的桌面应用,特别是以下场景:
- 集成开发环境(IDEs):如Microsoft Visual Studio等,需要动态调整、自由组合的窗口面板,以提升用户的工作效率。
- 图像处理软件:复杂的图像处理流程需要多窗口、多面板的协同工作,Qt Advanced Docking System可以很好地满足这种需求。
- 数据分析工具:在数据分析过程中,用户可能需要同时查看多个数据集或图表,Qt Advanced Docking System可以帮助用户轻松管理这些窗口和面板。
- 多任务操作窗口:需要用户进行多任务操作的场景中,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**论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。