【Qt学习之路】Qt进度条显示拷贝文件夹和文件进度

1、简述

最近在研究Qt的进度条显示,做了个示例,供大家参考

2、效果图

3、核心代码

头文件

#ifndef SFILECOPY_H
#define SFILECOPY_H

#include <QObject>
#include <QDir>

class SFileCopy : public QObject
{
    Q_OBJECT
public:
    explicit SFileCopy(QObject *parent = 0);
    ~SFileCopy();

    //拷贝文件:
    bool copyFileToPath(QString sourceDir ,QString toDir, bool coverFileIfExist);

    //拷贝文件夹:
    bool copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist);
signals:
    void sigCopyDirStation(float num);
    void sigCopyDirOver();
private:
    QDir * m_createfile = Q_NULLPTR;
    float m_total = 0;
    float m_value = 0;
    bool m_firstRead = true;
};

#endif // SFILECOPY_H

源文件

#include "sfilecopy.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QDebug>

SFileCopy::SFileCopy(QObject *parent) : QObject(parent)
{
    m_createfile = new QDir();
}

SFileCopy::~SFileCopy()
{
    if(m_createfile) {
        m_createfile = Q_NULLPTR;
        delete m_createfile;
    }
}

bool SFileCopy::copyFileToPath(QString sourceDir, QString toDir, bool coverFileIfExist)
{
    toDir.replace("\\","/");
    if (sourceDir == toDir){
        return true;
    }
    if (!QFile::exists(sourceDir)){
        return false;
    }
    bool exist = m_createfile->exists(toDir);
    if (exist){
        if(coverFileIfExist){
            m_createfile->remove(toDir);
        }
    }//end if

    if(!QFile::copy(sourceDir, toDir)) {
        return false;
    }
    return true;
}

bool SFileCopy::copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
    QDir sourceDir(fromDir);
    QDir targetDir(toDir);
    qDebug() << "copyDirectoryFiles:" << fromDir << toDir;
    if(!targetDir.exists()){    /**< 如果目标目录不存在,则进行创建 */
        if(!targetDir.mkdir(targetDir.absolutePath())) {
            return false;
        }
    }
    QFileInfoList fileInfoList = sourceDir.entryInfoList();

    if(m_firstRead) {
        int isfileTMP = 0;
        qDebug() << "a copyDirectoryFiles:" << fileInfoList.count();
        foreach(QFileInfo fileInfo, fileInfoList){
            if(fileInfo.isFile()) {
                isfileTMP++;
            }
        }
        m_total = fileInfoList.count() - 2 - isfileTMP; // 2为.和..
        m_value = 0;
        m_firstRead = false;
        qDebug() << "a copyDirectoryFiles:" << fileInfoList.count() <<m_total << isfileTMP;
        emit sigCopyDirStation(m_value/m_total);
        if(m_value == m_total) {
            m_firstRead = true;
            emit sigCopyDirStation(1);
            emit sigCopyDirOver();
        }
    } else {
        m_value++;
        if(m_value == m_total) {
            m_firstRead = true;
            emit sigCopyDirOver();
        }
        qDebug() << "a copyDirectoryFiles:" << m_value <<m_total;
        emit sigCopyDirStation(m_value/m_total);
    }
    foreach(QFileInfo fileInfo, fileInfoList){
        if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") {
            continue;
        }
        if(fileInfo.isDir()){    /**< 当为目录时,递归的进行copy */
            if(!copyDirectoryFiles(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()), coverFileIfExist)) {
                return false;
            }
        } else{            /**< 当允许覆盖操作时,将旧文件进行删除操作 */
            if(coverFileIfExist && targetDir.exists(fileInfo.fileName())){
                targetDir.remove(fileInfo.fileName());
            }
            /// 进行文件copy
            if(!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))){
                return false;
            }
        }
    }
    return true;
}


4、调用方法

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_file = new SFileCopy(this);
    connect(m_file, &SFileCopy::sigCopyDirStation,[=](float num){
        ui->progressBar->setValue(100*num);
    });
    connect(m_file, &SFileCopy::sigCopyDirOver,[=](){
        ui->label->setText("Over");
    });
    m_fileDialog = new QFileDialog(this);
    m_fileDialog->setWindowTitle(tr("Open"));
    m_fileDialog->setDirectory(".");
    m_fileDialog->setFileMode(QFileDialog::DirectoryOnly);
    m_fileDialog->hide();
}

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

void MainWindow::on_pushButton_clicked()
{
    ui->label->setText("");
    m_fileDialog->show();
    QStringList files;
    if(m_fileDialog->exec() == QDialog::Accepted) {
        files = m_fileDialog->selectedFiles();
    }
    QString fTMP = files.first();
    QString newTMP = fTMP + QDateTime::currentDateTime().toString("yyyy-MM-dd");
    m_file->copyDirectoryFiles(fTMP, newTMP , true);
}


注:Demo仅供参考~~

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沙振宇

你的鼓励将是我创作的最大动力~

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

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

打赏作者

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

抵扣说明:

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

余额充值