Qt 文件拷贝带进度条显示

1、拷贝中

2、拷贝结束


3、拷贝线程源码,拷贝做了过滤,只复制源文件夹下的 .jpg、.avi文件

.h

#ifndef COPYTHREAD_H
#define COPYTHREAD_H
#include <QThread>
#include <QStringList>
 
enum{
    COPY_START=0,
    COPY_STOP,
    COPY_FILE_NAME,
    COPY_TOTAL_RATE,
    COPY_SINGLE_RATE,
    COPY_ERROR_MEM_FULL
}COPY_STATION;
 
enum{
    SUCCESS=0,
    ERROR_SRC_PATH_NULL,
    ERROR_DES_PATH_NULL,
    ERROR_NO_FILES,
    ERROR_MEM_FULL
}RETURN_VALUE;
 
class CopyThread : public QThread
{
    Q_OBJECT
 
public:
    CopyThread();
 
    void run();
    int copyStart();
    void copyStop();
 
    void setSrcDirPath(QString path) { srcPath=path; }
    void setDesDirPath(QString path) { desPath=path; }
 
private:
    QStringList fileList;
 
    QString srcPath;
    QString desPath;
    bool bStop;
    unsigned long fileTotalSize;
    unsigned long curSize;
 
    int fileCopy(QString fileName);
 
signals:
    void copyStationSig(int flag,QString qsText);
};
 
#endif // COPYTHREAD_H
 

  .cpp

#include "copythread.h"
#include <QDebug>
#include <QFileInfo>
#include <QDir>
 
CopyThread::CopyThread()
{
 
}
 
int CopyThread::copyStart()
{
    // loading filelist
    QString fileType;
    QString fileName;
    QDir fileDir;
    QFileInfoList fileInfoList;
    QFileInfo fileInfo;
    int i=0;
 
    // check path
    fileInfo.setFile(srcPath);
    if(!fileInfo.isDir()) return ERROR_SRC_PATH_NULL;
    fileInfo.setFile(desPath);
    if(!fileInfo.isDir()) return ERROR_DES_PATH_NULL;
 
    fileList.clear();
    fileTotalSize=0;
    curSize=0;
 
    fileDir.setPath(srcPath);
    fileDir.setFilter(QDir::Files);             // 只选择文件其他的过滤掉
    fileInfoList = fileDir.entryInfoList();     // 获取文件信息列表
 
    do{
        fileInfo = fileInfoList.at(i);
        fileType = fileInfo.fileName().split(".").last();
 
        if(fileType=="jpg" || fileType=="avi")   // jpg、avi
        {
            fileTotalSize+=fileInfo.size()/1024;
            fileName=srcPath+"/"+fileInfo.fileName();
            fileList<<fileName;
        }
        else
        {
            fileInfoList.removeOne(fileInfo);
            continue;
        }
        i++;
 
    }while(i<fileInfoList.size());
 
    if(0==fileList.count()) return ERROR_NO_FILES;
 
    bStop=false;
    emit copyStationSig(COPY_START,NULL);
    this->start();
    emit copyStationSig(COPY_STOP,NULL);
    return SUCCESS;
}
 
void CopyThread::copyStop()
{
    bStop=true;
}
 
void CopyThread::run()
{
    int i;
    QString fileName;
 
    for(i=0;i<fileList.count();++i)
    {
        fileName = fileList.at(i);
        emit copyStationSig(COPY_FILE_NAME,fileName.split("/").last());
        if(ERROR_MEM_FULL==fileCopy(fileName))
        {
            bStop=true;
            emit copyStationSig(COPY_ERROR_MEM_FULL,NULL);
            this->exit();
            return;
        }
 
        if(bStop) break;
    }
 
    emit copyStationSig(COPY_STOP,fileName);
}
 
int CopyThread::fileCopy(QString fileName)
{
    QFileInfo fileInfo;
    QString desFileName;
    QByteArray byteArray;
    unsigned long fileSize;
    QString qsStaText;
    unsigned long count=0;
    unsigned long freeSpace= 5*1024*1024;
 
    desFileName=desPath + "/" + fileName.split("/").last();
 
    fileInfo.setFile(fileName);
    fileSize=fileInfo.size()/1024;
 
    if(fileSize>freeSpace) return ERROR_MEM_FULL;
 
    fileInfo.setFile(desFileName);
    if(fileInfo.isFile())                       // 存在则删除
    {
        qDebug()<<desFileName<<" 该文件已存在!";
        QFile::remove(desFileName);
    }
 
    // 创建目标文件
    QFile desFile(desFileName);
    desFile.open(QIODevice::WriteOnly);
 
    // 打开原文件
    QFile srcFile(fileName);
    srcFile.open(QIODevice::ReadOnly);
 
    while(!srcFile.atEnd())
    {
        count++;
        byteArray=srcFile.read(1024);
        desFile.write(byteArray);
 
        qsStaText = QString::number(100*count/fileSize);
        emit copyStationSig(COPY_SINGLE_RATE,qsStaText);
 
        qsStaText = QString::number(100*(curSize+count)/fileTotalSize);
        emit copyStationSig(COPY_TOTAL_RATE,qsStaText);
 
        if(bStop)
        {
            desFile.close();
            srcFile.close();
            QFile::remove(desFileName);
            return SUCCESS;
        }
    }
 
    desFile.close();
    srcFile.close();
 
    curSize+=fileSize;
 
    return SUCCESS;
}
 


4、工程链接:http://download.csdn.net/detail/qq_18854309/9829694

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: qt线程文件拷贝进度条程序的下载,在这里我将简单介绍一下实现的思路与步骤。 首先,在使用Qt进行多线程文件拷贝进度显示之前,我们需要引入Qt的相关头文件,例如QFile、QThread等。 接下来,我们需要创建一个自定义的线程类,继承自QThread。在这个线程类中,我们需要重写run()函数,在run()函数中实现文件拷贝操作。具体的拷贝操作可以使用QFile类中的copy()函数。 为了实现进度条显示,我们可以通过信号与槽机制来实现。我们可以在自定义的线程类中定义一个信号,用来传递文件拷贝进度。可以使用QFile类的size()函数获取文件的总大小,然后在每次拷贝一个块的时候,发送一个信号,参数为已拷贝的字节数,通过计算已拷贝字节数和文件总大小的比例,来计算拷贝进度。 在主线程或主窗口类中,我们需要创建一个进度条控件用于显示拷贝进度。然后连接自定义的线程中的信号与主线程中的槽函数,以更新进度条进度。 在点击开始拷贝按钮的时候,我们需要创建一个自定义的线程对象,并调用start()函数启动线程。然后在槽函数中处理接收到的信号,更新进度条进度。 以上就是实现qt线程文件拷贝进度条程序的简要步骤。通过多线程的方式进行文件拷贝,可以使程序在拷贝较大文件时不会出现界面卡顿的情况,同时通过进度条可以直观地显示拷贝进度。 ### 回答2: 对于Qt线程文件拷贝进度条程序的下载,我们可以采用如下步骤: 1. 首先,在Qt中创建一个新的工程,添加一个进度条控件和一个按钮控件。 2. 在主线程中点击按钮事件的槽函数中,创建一个新的子线程,并传递需要拷贝文件路径和目标路径作为参数。 3. 在子线程中,使用Qt文件操作类QFile进行文件拷贝。通过打开源文件,创建目标文件并复制源文件内容到目标文件中,实现文件拷贝的功能。 4. 在拷贝文件的过程中,可以在子线程中实时更新进度条的值,并通过信号和槽机制将进度条的值传递给主线程。 5. 在主线程中,接收并处理来自子线程进度条值变化的信号,实时更新界面上的进度条显示。 6. 当文件拷贝完成后,子线程发送一个完成信号给主线程,主线程处理该信号,提示文件拷贝已完成。 7. 最后,通过Qt的信号和槽机制,将按钮的点击事件和文件拷贝的相关操作进行连接,使得点击按钮时可以启动文件拷贝进度条程序的下载。 通过以上步骤,我们可以实现一个基于Qt线程进度条文件拷贝程序。用户可以通过点击界面上的按钮来触发拷贝过程,并实时显示拷贝进度。这样可以提高文件拷贝的效率,并提供更好的用户体验。 ### 回答3: Qt是一种跨平台的C++应用程序开发框架,它提供了丰富的功能库和工具,可以帮助开发者快速构建各种类型的应用程序。在Qt中,我们可以使用多线程来实现文件拷贝功能,并在界面上显示一个进度条,以便用户能够清楚地了解文件拷贝进度。 首先,我们需要创建一个继承自QThread的自定义类,用于执行文件拷贝的操作。在这个类中,我们可以重写run()函数,在函数中执行拷贝文件的逻辑。在拷贝文件的过程中,我们可以通过信号机制来实时发送拷贝进度给主线程。 在主线程中,我们可以创建一个进度条控件,并与自定义的文件拷贝线程进行连接。当文件拷贝线程发送进度信号时,我们可以更新进度条的值,让用户能够实时观察到文件拷贝进度。 同时,我们还可以提供一些用户交互的功能,比如添加文件、选择目标文件夹等。这些功能可以通过Qt的信号与槽机制来实现,用户可以触发相应的信号,然后我们在槽函数中执行相应的操作,比如选择文件,选择目标文件夹等。 除此之外,为了防止文件拷贝操作过程中出现的各种异常情况,我们还可以在文件拷贝线程中进行错误处理和异常捕获,并通过信号与槽机制向主线程发送错误信息,以便及时通知用户。 总而言之,通过Qt线程和信号与槽机制,我们可以简单地实现一个多线程文件拷贝进度条程序的下载功能。这样用户可以在界面上直观地看到文件拷贝进度,并能够通过界面交互实现文件选择和目标文件夹选择等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拥抱藍天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值