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));}
}
项目特色
- 现代化界面设计:采用分组布局,界面清晰美观
- 多线程处理:后台压缩不阻塞界面操作
- 拖拽支持:提升用户操作体验
- 进度反馈:实时显示操作进度和状态
- 错误处理:完善的异常处理和用户提示
- 跨平台支持:基于Qt框架,支持多平台
编译运行
- 使用Qt Creator打开
18_FileCompressionTool.pro
文件 - 配置MinGW32编译器
- 构建并运行项目
总结
本项目展示了Qt桌面应用程序开发的完整流程,涵盖了界面设计、多线程处理、文件操作、信号槽机制等核心技术。通过这个项目,可以学习到:
- Qt Widgets界面开发
- 多线程编程和线程间通信
- 文件压缩算法实现
- 用户交互设计
- 错误处理和用户体验优化
项目代码结构清晰,注释详细,适合作为Qt学习的教学案例。
源代码下载链接:https://download.csdn.net/download/weixin_42059464/91725199
开发环境:Qt 5.9.9 + MinGW32 + Windows 10