【项目实战】Qt开发的文件复制软件
基于Qt实现指定路径下的文件复制
开发环境:Window10,+Qt5.10 + MSVC12
实现功能:
- 在指定路径下查找指定后缀的文件,并将其复制到指定的文件夹下;
- 复制过程中实现 raw10转raw8、raw转bmp的功能,并将转换后的文件保存;
界面显示:

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

最主要解决的问题是遍历指定路径下指定后缀的文件,参考如下代码:
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;
}
开发过程中出现的问题:
- 显示信息时不能实时显示,运行结束把所有内容显示出来。解决方案,在for循环中增加
QApplication::processEvents();
processEvents();该函数根据指定的标志处理调用线程的所有挂起事件,直到没有更多的事件要处理。当程序忙于执行长时间的操作时,比如复制文件,可以偶尔调用此函数。如果正在运行连续调用此函数的本地循环,而没有事件循环,则不会处理DeferredDelete事件,这可能会应用以来DeferredDelete事件正常运行的小部件例如QToolTip的行为。另一种方法是从本地循环中调用sendPostEvents()函数。
- 给应用程序增加图标
把图标放在工程目录下,比如图标名称为incognito.ico,在.pro文件中添加如下代码,重新构建运行即可。
RC_ICONS = incognito.ico
- 打包应用程序
打包应用程序时需要把用到的文件与应用程序放到同一个目录,首先把应用程序放到一个空文件夹内,找到Qt...for Desktop,并打开,转到应用程序所在文件夹,假设就在桌面,路径为C:\Users\Administrator\Desktop\CopyFiles,应用程序名称为CopyFiles.exe,使用命令windeployqt CopyFiles.exe可以复制需要的文件到该路径下


- 可变参数列表
包含可变参数的头文件为:#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());
}
}

浙公网安备 33010602011771号