当前位置: 首页 > news >正文

Qt文件压缩工具项目开发教程

Qt文件压缩工具项目开发教程

项目概述

本项目是一个基于Qt 5.9.9开发的文件压缩工具,具有现代化的用户界面和强大的功能特性。该工具支持多种压缩格式(ZIP、GZIP),提供文件压缩、解压缩、批量处理等功能,是一个完整的桌面应用程序开发案例。

主要特性

  • 多格式支持:ZIP、GZIP压缩格式
  • 批量处理:支持多文件和文件夹同时压缩
  • 拖拽操作:支持文件拖拽到界面
  • 进度显示:实时显示压缩/解压进度
  • 多线程处理:后台处理,不阻塞界面
  • 现代化UI:美观的用户界面设计

技术栈

  • 开发框架:Qt 5.9.9
  • 编译器:MinGW32
  • 开发语言:C++
  • 界面设计:Qt Widgets + .ui文件
  • 多线程:QThread + QObject
  • 压缩库:zlib

项目结构

18_FileCompressionTool/
├── 18_FileCompressionTool.pro    # Qt项目文件
├── main.cpp                      # 程序入口
├── mainwindow.h                  # 主窗口头文件
├── mainwindow.cpp                # 主窗口实现
├── mainwindow.ui                 # UI界面文件
├── compressionworker.h           # 压缩工作线程头文件
├── compressionworker.cpp         # 压缩工作线程实现
└── README.md                     # 项目说明

源代码下载链接:https://download.csdn.net/download/weixin_42059464/91725199

核心功能实现

1. 界面设计

在这里插入图片描述

主窗口采用分组布局设计,包含文件列表、压缩设置、操作按钮和进度显示四个主要区域。

// mainwindow.h - 界面组件定义
class MainWindow : public QMainWindow
{
private:// 文件列表区域QGroupBox *fileGroupBox;QListWidget *fileListWidget;QPushButton *addFilesButton;QPushButton *addFolderButton;QPushButton *removeFilesButton;QPushButton *clearFilesButton;// 压缩设置区域QGroupBox *settingsGroupBox;QComboBox *formatComboBox;QComboBox *levelComboBox;QLineEdit *outputPathEdit;QPushButton *browseOutputButton;// 操作区域QGroupBox *operationGroupBox;QPushButton *compressButton;QPushButton *extractButton;// 进度区域QGroupBox *progressGroupBox;QProgressBar *progressBar;QLabel *statusLabel;
};

界面初始化代码:

// mainwindow.cpp - 界面设置
void MainWindow::setupUI()
{// 创建中央部件和主布局centralWidget = new QWidget(this);setCentralWidget(centralWidget);mainLayout = new QVBoxLayout(centralWidget);mainLayout->setSpacing(10);mainLayout->setContentsMargins(10, 10, 10, 10);// 文件列表区域fileGroupBox = new QGroupBox("文件列表", centralWidget);QVBoxLayout *fileLayout = new QVBoxLayout(fileGroupBox);fileListWidget = new QListWidget(fileGroupBox);fileListWidget->setMinimumHeight(150);fileListWidget->setAcceptDrops(true);fileListWidget->setDragEnabled(true);fileListWidget->setDragDropMode(QAbstractItemView::DragDrop);// 添加按钮布局fileButtonLayout = new QHBoxLayout();addFilesButton = new QPushButton("添加文件", fileGroupBox);addFolderButton = new QPushButton("添加文件夹", fileGroupBox);removeFilesButton = new QPushButton("移除文件", fileGroupBox);clearFilesButton = new QPushButton("清空列表", fileGroupBox);fileButtonLayout->addWidget(addFilesButton);fileButtonLayout->addWidget(addFolderButton);fileButtonLayout->addWidget(removeFilesButton);fileButtonLayout->addWidget(clearFilesButton);fileButtonLayout->addStretch();
}

2. 信号槽机制

项目采用Qt的信号槽机制实现组件间的通信,确保界面响应性和数据一致性。

// mainwindow.cpp - 信号槽连接
void MainWindow::setupConnections()
{// 文件操作信号槽connect(addFilesButton, &QPushButton::clicked, this, &MainWindow::onAddFilesClicked);connect(addFolderButton, &QPushButton::clicked, this, &MainWindow::onAddFolderClicked);connect(removeFilesButton, &QPushButton::clicked, this, &MainWindow::onRemoveFilesClicked);connect(clearFilesButton, &QPushButton::clicked, this, &MainWindow::onClearFilesClicked);// 压缩操作信号槽connect(compressButton, &QPushButton::clicked, this, &MainWindow::onCompressClicked);connect(extractButton, &QPushButton::clicked, this, &MainWindow::onExtractClicked);connect(browseOutputButton, &QPushButton::clicked, this, &MainWindow::onBrowseOutputClicked);// 工作线程信号槽connect(compressionWorker, &CompressionWorker::compressionProgress,this, &MainWindow::onCompressionProgress);connect(compressionWorker, &CompressionWorker::compressionFinished,this, &MainWindow::onCompressionFinished);connect(compressionWorker, &CompressionWorker::extractionProgress,this, &MainWindow::onExtractionProgress);connect(compressionWorker, &CompressionWorker::extractionFinished,this, &MainWindow::onExtractionFinished);
}

3. 多线程处理

使用QThread和QObject实现后台压缩处理,避免界面阻塞。

// compressionworker.h - 工作线程定义
class CompressionWorker : public QObject
{Q_OBJECTpublic:enum CompressionFormat {ZIP,GZIP,BZIP2};enum CompressionLevel {FAST = 1,NORMAL = 5,MAXIMUM = 9};public slots:void compressFiles(const QStringList &fileList, const QString &outputPath,CompressionFormat format = ZIP,CompressionLevel level = NORMAL);void extractFile(const QString &archivePath, const QString &outputPath);void cancelOperation();signals:void compressionProgress(int percentage);void compressionFinished(bool success, const QString &message);void extractionProgress(int percentage);void extractionFinished(bool success, const QString &message);
};

线程创建和管理:

// mainwindow.cpp - 线程管理
void MainWindow::onCompressClicked()
{if (fileList.isEmpty()) {QMessageBox::warning(this, "警告", "请先添加要压缩的文件");return;}// 创建工作线程compressionWorker = new CompressionWorker();workerThread = new QThread();compressionWorker->moveToThread(workerThread);// 连接信号槽connect(workerThread, &QThread::started, [this]() {CompressionWorker::CompressionFormat format = static_cast<CompressionWorker::CompressionFormat>(formatComboBox->currentIndex());CompressionWorker::CompressionLevel level = static_cast<CompressionWorker::CompressionLevel>(levelComboBox->currentIndex());compressionWorker->compressFiles(fileList, outputDirectory, format, level);});connect(compressionWorker, &CompressionWorker::compressionFinished,workerThread, &QThread::quit);connect(compressionWorker, &CompressionWorker::compressionFinished,compressionWorker, &CompressionWorker::deleteLater);connect(workerThread, &QThread::finished,workerThread, &QThread::deleteLater);// 启动线程enableControls(false);workerThread->start();
}

4. 文件压缩实现

核心压缩算法使用zlib库实现,支持ZIP和GZIP格式。

// compressionworker.cpp - ZIP压缩实现
bool CompressionWorker::compressToZip(const QStringList &fileList, const QString &outputPath,CompressionLevel level)
{QFile outputFile(outputPath);if (!outputFile.open(QIODevice::WriteOnly)) {return false;}QDataStream out(&outputFile);out.setByteOrder(QDataStream::LittleEndian);QList<QPair<QString, qint64>> fileEntries;qint64 centralDirectoryOffset = 0;// 写入每个文件的本地文件头和数据for (const QString &filePath : fileList) {QFileInfo fileInfo(filePath);QString relativePath = fileInfo.fileName();qint64 localHeaderOffset = outputFile.pos();if (!compressFileToZip(filePath, relativePath, out, level, fileEntries)) {return false;}// 检查是否取消操作{QMutexLocker locker(&cancelMutex);if (isCancelled) return false;}}centralDirectoryOffset = outputFile.pos();// 写入中央目录for (const auto &entry : fileEntries) {if (!writeCentralDirectoryEntry(entry.first, entry.second, out)) {return false;}}// 写入结束中央目录记录qint64 endCentralDirectoryOffset = outputFile.pos();quint16 totalEntries = fileEntries.size();// 写入结束中央目录记录out << quint32(0x06054b50);  // 签名out << quint16(0);           // 当前磁盘编号out << quint16(0);           // 中央目录开始磁盘编号out << quint16(totalEntries); // 当前磁盘上的条目数out << quint16(totalEntries); // 总条目数out << quint32(endCentralDirectoryOffset - centralDirectoryOffset); // 中央目录大小out << quint32(centralDirectoryOffset); // 中央目录偏移out << quint16(0);           // 注释长度return true;
}

5. 拖拽功能实现

支持文件拖拽到界面,提升用户体验。

// mainwindow.cpp - 拖拽事件处理
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{if (event->mimeData()->hasUrls()) {event->acceptProposedAction();}
}void MainWindow::dropEvent(QDropEvent *event)
{const QMimeData *mimeData = event->mimeData();if (mimeData->hasUrls()) {QStringList newFiles;for (const QUrl &url : mimeData->urls()) {QString localPath = url.toLocalFile();QFileInfo fileInfo(localPath);if (fileInfo.exists()) {if (fileInfo.isFile()) {newFiles.append(localPath);} else if (fileInfo.isDir()) {// 递归添加文件夹中的所有文件QDirIterator it(localPath, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);while (it.hasNext()) {newFiles.append(it.next());}}}}// 添加到文件列表for (const QString &filePath : newFiles) {if (!fileList.contains(filePath)) {fileList.append(filePath);}}updateFileList();statusBar()->showMessage(QString("已添加 %1 个文件").arg(newFiles.size()), 3000);}
}

6. 进度显示和状态反馈

实时显示压缩进度和操作状态。

// mainwindow.cpp - 进度更新
void MainWindow::onCompressionProgress(int percentage)
{progressBar->setValue(percentage);statusLabel->setText(QString("压缩进度: %1%").arg(percentage));statusBar()->showMessage(QString("正在压缩... %1%").arg(percentage));
}void MainWindow::onCompressionFinished(bool success, const QString &message)
{progressBar->setValue(success ? 100 : 0);enableControls(true);if (success) {statusLabel->setText("压缩完成");statusBar()->showMessage("文件压缩成功", 3000);QMessageBox::information(this, "成功", "文件压缩完成!");} else {statusLabel->setText("压缩失败");statusBar()->showMessage("压缩失败", 3000);QMessageBox::critical(this, "错误", QString("压缩失败: %1").arg(message));}
}

项目特色

  1. 现代化界面设计:采用分组布局,界面清晰美观
  2. 多线程处理:后台压缩不阻塞界面操作
  3. 拖拽支持:提升用户操作体验
  4. 进度反馈:实时显示操作进度和状态
  5. 错误处理:完善的异常处理和用户提示
  6. 跨平台支持:基于Qt框架,支持多平台

编译运行

  1. 使用Qt Creator打开 18_FileCompressionTool.pro 文件
  2. 配置MinGW32编译器
  3. 构建并运行项目

总结

本项目展示了Qt桌面应用程序开发的完整流程,涵盖了界面设计、多线程处理、文件操作、信号槽机制等核心技术。通过这个项目,可以学习到:

  • Qt Widgets界面开发
  • 多线程编程和线程间通信
  • 文件压缩算法实现
  • 用户交互设计
  • 错误处理和用户体验优化

项目代码结构清晰,注释详细,适合作为Qt学习的教学案例。


源代码下载链接:https://download.csdn.net/download/weixin_42059464/91725199

开发环境:Qt 5.9.9 + MinGW32 + Windows 10

http://www.dtcms.com/a/342074.html

相关文章:

  • 【Bug】CentOS 7 使用vim命令报错vim: command not found
  • 开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑
  • Elasticsearch官方文档学习-未完待续
  • java项目:如何优化JVM参数?
  • 【深入理解 Linux 网络】收包原理与内核实现(下) 从 TCP 传输层到应用
  • 遥感机器学习入门实战教程|Sklearn案例⑤:集成学习方法全览
  • ES_flattened
  • Nacos部署微服务
  • Python机器学习入门:用scikit-learn构建你的第一个预测模型
  • 安装nvtop编译报错:fatal error: linux/kcmp.h: No such file or directory
  • 亚远景科技助力力邦合信通过ASPICE CL2评估
  • 今日科技焦点 | A股科技芯片受追捧,美股科技股承压——技术赛道的资本与市场博弈
  • 云计算下数据隐私保护系统的设计与实现(LW+源码+讲解+部署)
  • 2025高性能氢气传感器领域的创新引领者:杭州德克西智能科技有限公司
  • 云计算学习笔记——用户和组的管理、周期性任务篇
  • ECCV 2020 | 动态图像在3D MRI图像阿尔茨海默病分类中的应用
  • Wireshark USRP联合波形捕获
  • 软件测试体系建设要怎么做
  • 手写MyBatis第28弹:告别代理,直击本质:手写MyBatis SqlSession的增删改查奥秘
  • 深入解析HashMap的存储机制:扰动函数、哈希计算与索引定位
  • Halcon那些事:Halcon非常核心的1个概念reduce_domain算子的理解和1个详细的使用示例
  • Nginx缓存配置指南:使用proxy_cache为动态网站提速10倍
  • WPF中UI线程频繁操作造成卡顿的处理
  • Ingress控制器深度解析:Nginx与Traefik实战指南
  • 【DICOM HL7】DICOM hl7协议的哪个字段对应操作者,操作者ID?
  • C++析构函数
  • Linux下Docker版本升级保姆攻略
  • 结合 Flutter 和 Rust 的跨平台开发方案
  • 微软Auzre云的技术支持运营模式是什么
  • Flutter - UI布局