qt5 7zip源码编译及使用(含展示进度)

目录

一、下载相关资源:

二、编译bit7z64.lib 静态库

三、使用静态库bit7z64.lib

 四、成果展示

 五、主要代码


一、下载相关资源:

       借鉴https://blog.csdn.net/u011718663/article/details/119574759https://blog.csdn.net/u011718663/article/details/119574759

       1.1 下载bit7z源码:https://github.com/rikyoz/bit7z

            这个分支好用:https://gitcode.net/mirrors/rikyoz/Bit7z/-/tree/hotfix/v3.1.4

       1.2 下载lzma源码:7-Zip - LZMA SDK(软件开发工具包)(英文版)

       1.3 下载7z.dll: 7-Zip - 程序下载

                  (也可以通过百度搜索直接下载7z.dll)

          私货:如果嫌麻烦,有已编译好的,可以运行的demo,下载地址:qt7zip压缩解压含进度-QT文档类资源-CSDN下载     

二、编译bit7z64.lib 静态库

       解压下载的bit7z-master.zip和lzma1805.zip的压缩包,

       如果bit7z最新分支不好用,用分支v3.14,工程环境比较完整

          https://gitcode.net/mirrors/rikyoz/Bit7z/-/tree/hotfix/v3.1.4

      qt5 7zip源码编译及使用(含展示进度)_第1张图片       

2.1 将解压lzma1805.zip的如下文件:

qt5 7zip源码编译及使用(含展示进度)_第2张图片

2.2 放入解压bit7z-master.zip的如下位置:

qt5 7zip源码编译及使用(含展示进度)_第3张图片

 2.3 在bit7z-master中找到pro文件,加载编译,就可以编译出bit7z64.lib

三、使用静态库bit7z64.lib

3.1 使用时编译会编译不通过,参考博客末尾处有解决方法:Qt5.12.9编译QuaZip并使用 及 直接调用7z_韭菜钟的博客-CSDN博客

3.2 原博客末尾关键处截图:

qt5 7zip源码编译及使用(含展示进度)_第4张图片

我改造了一下,将他们放在同一个目录中:   LIBS += -L$$PWD/../lib -lbit7z64 -lOleAut32 -lUser32

 四、成果展示

4.1 lib目录中,将window10中的OleAut32.Lib和User32.Lib库拷贝到此lib目录中

qt5 7zip源码编译及使用(含展示进度)_第5张图片

4.2 bin64中,可以自己通过windeployqt命令补全环境,或者用开发工具打开源码编译运行

 qt5 7zip源码编译及使用(含展示进度)_第6张图片

 五、主要代码

5.1 封装类ZlibHelper代码

#ifndef ZLIBHELPER_H
#define ZLIBHELPER_H

#ifndef NIMO_OBS_ZLIB_H
#define NIMO_OBS_ZLIB_H
#include 
#include 
#include 
#include 
#include 

using namespace std;

class ZlibHelper : public QObject
{
    Q_OBJECT

public:
    ZlibHelper();
    ~ZlibHelper();
    void extract(const QString& sZip, const QString& sDir); // 解压
    void compress(const QString& sDir, const QString& sZip); // 压缩

private:
    void callbackProcess(uint64_t size);
    void callbackFile(wstring filename);
    void callbackTotal(uint64_t size);
    wstring stringToWstring_WindowApi(const string &str);
    string wstringToString_WindowsApi(const wstring &wstr);

signals:
    void sigProgress(uint64_t nValue, uint64_t nTotalSize);
    void sigProgressFile(QString sFile);

private:
    uint64_t m_nTotalSize; // 压缩前文件夹原始大小
};
#endif

#endif // ZLIBHELPER_H
#include "ZlibHelper.h"
#include "bit7z.hpp"
#include "bit7zlibrary.hpp"
#include 
#include 
using namespace bit7z;

//----------------------------------------------------------------------------
ZlibHelper::ZlibHelper()
    : m_nTotalSize(0)
{

}

//----------------------------------------------------------------------------
ZlibHelper::~ZlibHelper()
{
}

//----------------------------------------------------------------------------
void ZlibHelper::callbackProcess(uint64_t size)
{
//    double process = ((1.0 * size) / mSize);
    qDebug()<

5.2 调用主界面代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked(); // 压缩
    void on_pushButton_2_clicked(); // 解压

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "ZlibHelper.h"

#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ZlibHelper zlibHelper;
    QString sDir = "H:/ttZip中文";
    QString sZip = "H:/ttZip中文.7z";
    zlibHelper.compress(sDir, sZip);
}

void MainWindow::on_pushButton_2_clicked()
{
    ZlibHelper zlibHelper;
    QString sZip = "H:/ttZip中文.7z";
    QString sDir = "H:/ttZip中文测试";
    zlibHelper.extract(sZip, sDir);
}

你可能感兴趣的:(qt5,c++,windows)