返回顶部

【项目实战】Qt开发的文件复制软件

基于Qt实现指定路径下的文件复制

开发环境:Window10,+Qt5.10 + MSVC12
实现功能:

  1. 在指定路径下查找指定后缀的文件,并将其复制到指定的文件夹下;
  2. 复制过程中实现 raw10转raw8、raw转bmp的功能,并将转换后的文件保存;

界面显示:
image

  • OldPath:原始指定路径
  • NewPath:文件复制到的目标路径
  • oldFilesFilter:查找的指定文件后缀
  • newFileSuffix:复制后的文件后缀,若未指定,则与oldFileFilter保持一致
  • 文件转换:复制过程中进行文件转换,选择不为null时,会保存转换前的文件和转换后的文件,当选择raw10转raw8或者raw转bmp时,需要在界面右上角设置raw图的相关信息,可选的转换类型有:
    • null:表示复制时不进行转换
    • Raw10ToRaw8:指定的是raw10文件,需要转换为raw8文件;
    • RawToBmp:指定的是raw图,转换为bmp文件;
      image

最主要解决的问题是遍历指定路径下指定后缀的文件,参考如下代码:

QStringList GetFileList(const QString &dirpath, const QString &fileFilter/* = " "*/)
{
    QStringList filesList;
    QDir dir(dirpath);
    QFileInfoList filesInfoList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Dirs);
    for(QFileInfo fileInfo:filesInfoList)
    {
        if(fileInfo.isDir())  // 如果获取的是目录,获取该目录下的所有文件
        {
            GetFileList(fileInfo.absoluteFilePath());
        }
        else if(fileInfo.isFile())  // 如果是文件,根据过滤器获取文件
        {
            QString strtmp = fileInfo.absoluteFilePath();
            if(strtmp.endsWith(fileFilter))
            {
                filesList.push_back(strtmp);
            }
        }
    }

    return filesList;
}

开发过程中出现的问题:

  1. 显示信息时不能实时显示,运行结束把所有内容显示出来。解决方案,在for循环中增加 QApplication::processEvents();

processEvents(); 该函数根据指定的标志处理调用线程的所有挂起事件,直到没有更多的事件要处理。当程序忙于执行长时间的操作时,比如复制文件,可以偶尔调用此函数。如果正在运行连续调用此函数的本地循环,而没有事件循环,则不会处理DeferredDelete事件,这可能会应用以来DeferredDelete事件正常运行的小部件例如QToolTip的行为。另一种方法是从本地循环中调用sendPostEvents()函数。

  1. 给应用程序增加图标
    把图标放在工程目录下,比如图标名称为incognito.ico,在.pro文件中添加如下代码,重新构建运行即可。
RC_ICONS = incognito.ico
  1. 打包应用程序
    打包应用程序时需要把用到的文件与应用程序放到同一个目录,首先把应用程序放到一个空文件夹内,找到Qt...for Desktop,并打开,转到应用程序所在文件夹,假设就在桌面,路径为C:\Users\Administrator\Desktop\CopyFiles,应用程序名称为CopyFiles.exe,使用命令windeployqt CopyFiles.exe可以复制需要的文件到该路径下
    image

image

  1. 可变参数列表
    包含可变参数的头文件为:#include <stdarg.h>
va_list list;  // 定义一个可变参数列表指针,用于指示可选参数
va_start(list,fmt);  // 使用可变参数列表指针list指向函数参数列表中的第一个可选参数,fmt,是最后一个固定参数
va_arg(list,type);  // 返回参数列表指针list所指向的参数,返回类型为type,并使指针指向参数列表中下一个参数,返回的是可选参数,不包括固定参数
va_end(list);  // 清空参数列表,并设置参数指针list无效

示例,显示信息到界面上的QPlainTextEdit控件上,参考代码:

void AddLog(const char *fmt,...)
{
    QPlainTextEdit *plainTextEdit = ui->showInformation_plainTextEdit;
    // 设置当前控件为只读
    if(!ui->showInformation_plainTextEdit->isReadOnly())
    {
        ui->showInformation_plainTextEdit->setReadOnly(true);
    }

    // 设置光标到文本末尾
    plainTextEdit->moveCursor(QTextCursor::End,QTextCursor::MoveAnchor);

    va_list list;
    va_start(list,fmt);
    QDate date = QDate::currentDate();
    QTime time = QTime::currentTime();
    QString str = QString().vsprintf(fmt,list);
    va_end(list);
    QString strtext = "";
    strtext.sprintf("[%04d-%02d-%02d %02d:%02d:%02d.%03d]  %s\r\n",date.year(),date.month(),date.day(),time.hour(),time.minute(),time.second(),time.msec(),str.toStdString().data());

    ui->showInformation_plainTextEdit->insertPlainText(strtext);

    // 移动滚动条到底部
    QScrollBar * scrollbar = ui->showInformation_plainTextEdit->verticalScrollBar();
    if(scrollbar)
    {
        scrollbar->setSliderPosition(scrollbar->maximum());
    }
}

完整代码:git@gitee.com:zoya23/copy-files.git

posted @ 2022-12-19 18:04  Zoya23  阅读(353)  评论(0)    收藏  举报