qt--做一个拷贝文件器
一、项目要求
- 主窗口不能假死
- 主窗口进度条必须能动
- 改写文件大小的单位(自适应)
![]()
![]()
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024字节
二、所需技术
1.QFileDialog 文件对话框
QFileDialog也继承了QDialog类,直接使用静态成员函数弹窗,弹窗的结果(选择文件的路径)通过函数的返回值获取。
// 获得一个打开或保存的文件路径
// 参数1 父对象
// 参数2 即windowTitle属性(界面标题)
// 参数3 在哪个目录下打开,默认值表示项目的工作目录
// 参数4 文件格式过滤器
// 返回值 选择的文件路径,如果选择失败,返回空字符
QString QFileDialog::getSaveFileName|getOpenFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString())[static]
需要注意的是,QFileDialog只是一个窗口类,本身不具备任何IO能力。
2.QFileInfo 文件信息类
只需要创建出对象后,通过各种成员函数直接获取文件信息。
// 构造函数
// 参数为文件路径,如果文件非法,仍然可以创建出QFileInfo
QFileInfo::QFileInfo(const QString & file)// 判断文件或文件夹是否存在
// 如果存在返回true否则返回false
bool QFileInfo::exists() const// 返回文件大小,单位是字节
qint64 QFileInfo::size() const// 返回基础文件名
QString QFileInfo::baseName() const// 返回最近修改日期和时间
QDateTime QFileInfo::lastModified() const// 返回可读性
bool QFileInfo::isReadable() const
3.QFile文件读写类
在Qt中所有IO都都继承自QIODevice类,QIODevice类中规定了最基础的IO相关接口,这些接口虽然在不同的派生类中可能是实现有区别,但调用方式一致。
// 构造函数
// 参数为文件路径,如果是非法路径,也能创建出对象,但是不能正常IO
QFile::QFile(const QString & name)// 判断QFile对应的文件是否存在
bool QFile::exists() const// 打开数据流
// 参数为打开的模式
// 返回值为打开的结果
bool QIODevice::open(OpenMode mode)[virtual]// 读取最大长度为maxSize个字节到返回值中
QByteArray QIODevice::read(qint64 maxSize)// 写出数据
// 参数为写出的内容
// 返回值为实际的数据写出字节数,出错返回-1
qint64 QIODevice::write(const QByteArray & byteArray)// 判断是否读到文件尾部
bool QIODevice::atEnd() const[virtual]// 关闭文件流
void QIODevice::close()[virtual]// 清空缓存区
bool QFileDevice::flush()// 返回输入流的大小,单位是字节
qint64 QIODevice::size() const 4.ui界面

三、代码
//dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QFileDialog>
#include <QMessageBox>
#include <QDateTime>
#include <QFileInfo>
#include <QFile>
#include "mythread.h"
namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;QString readPath;QString writePath;void prinFileInfo();void copy();MyThread *ct;
private slots:void btnsClickedSlot();void valueSlot(int);
};#endif // DIALOG_H
//mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>
#include <QDebug>
#include <QFile>class MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent = 0);~MyThread();bool getRunningState() const;void setRunningState(bool value);void Pathget(QString, QString);signals:void valueSignal(int);
public slots:private:QString treadPath;QString twritePath;bool runningState;// 状态标记
protected:void run();
};#endif // MYTHREAD_H
//dialog.c
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);connect(ui->pushButtonOpen,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));
connect(ui->pushButtonSave,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));
connect(ui->pushButtonCopy,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));}Dialog::~Dialog()
{delete ui;
}void Dialog::prinFileInfo()
{QFileInfo info(readPath);if(!info.exists())return;qint64 size=info.size();qreal size2;QString text;if(size<1024){size2=size;QString text=QString ::number(size2);text.prepend("文件大小:").append("字节");ui->textBrowserOpen->append(text);}else if(size>=1024 && size<1048576){size2=size/1024;QString text=QString ::number(size2);text.prepend("文件大小:").append("K字节");ui->textBrowserOpen->append(text);}else if(size>=1048576&&size<1073741824){size2=size/1048576;QString text=QString ::number(size2);text.prepend("文件大小:").append("M字节");ui->textBrowserOpen->append(text);}else if(size>=1073741824&&size<1099511627776){size2=size/1073741824;QString text=QString ::number(size2);text.prepend("文件大小:").append("G字节");ui->textBrowserOpen->append(text);}text=info.baseName();text.prepend("文件名称:");ui->textBrowserOpen->append(text);text=info.lastModified().toString("修改时间:yyyy-MM-dd hh:mm:ss");ui->textBrowserOpen->append(text);bool result=info.isReadable();if(result)ui->textBrowserOpen->append("文件可读");elseui->textBrowserOpen->append("文件不可读");}void Dialog::copy()
{if(readPath==""){QMessageBox::warning(this,"提示","请选择要读取的文件");return;}else if(writePath==""){QMessageBox::warning(this,"提示","请选择要保存的文件");return;}QFile readFile(readPath);QFile writeFile(writePath);readFile.open(QIODevice::ReadOnly);writeFile.open(QIODevice::WriteOnly);writeFile.flush();readFile.close();writeFile.close();
}void Dialog::btnsClickedSlot()
{if(ui->pushButtonOpen==sender()){QString filter="所有文件(*.*);;Qt(*.cpp *.pro *.h *.ui)";//符号都是英语符号,用于检索QString path=QFileDialog::getOpenFileName(this,"打开","C:/",filter);if(path != ""){ui->textBrowserOpen->append(path);readPath=path;prinFileInfo();}else if (readPath == ""){QMessageBox::warning(this,"提示","请选择要打开的文件!");return;}}else if(ui->pushButtonSave==sender()){QString filter="所有文件(*.*);;Qt(*.cpp *.pro *.h *.ui)";QString path=QFileDialog::getSaveFileName(this,"保存","C:/",filter);if(path != "")
{ui->textBrowserSave->append(path);writePath=path;
}else if (writePath == ""){QMessageBox::warning(this,"提示","请选择要保存的文件!");return;}}else if(ui->pushButtonCopy==sender()){// 创建子线程对象并启动if(ui->pushButtonCopy->text() == "开始拷贝"){copy();ct = new MyThread(this);connect(ct,SIGNAL(valueSignal(int)),this,SLOT(valueSlot(int)));ct->start();ui->pushButtonCopy->setText("停止拷贝");}else if (ui->pushButtonCopy->text() == "停止拷贝"){ui->pushButtonCopy->setText("开始拷贝");ct->setRunningState(false);}}
}
void Dialog::valueSlot(int value)
{ui->progressBar->setValue(value);if(value == 100){// 释放按钮ui->pushButtonCopy->setEnabled(true);this->hide();// 隐藏主窗口,只是看不到this->show();// 显示主窗口QMessageBox::information(this,"通知","文件拷贝完毕");}
}
//mythread.c
#include "mythread.h"MyThread::MyThread(QObject *parent) : QThread(parent)
{setRunningState(true);
}MyThread::~MyThread()
{}bool MyThread::getRunningState() const
{return runningState;
}void MyThread::setRunningState(bool value)
{runningState = value;
}void MyThread::run()
{for(int i = 0 ;i <= 100 && runningState;i++){QThread::msleep(100);emit valueSignal(i);}qDebug() << "资源已释放";}
四、实验结果

相关文章:
qt--做一个拷贝文件器
一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位(自适应) 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类,直接使用静态…...
Eclipse 搭建 C/C++ 开发环境以及eclipse的使用
一、下载、安装 MinGW 1、下载: 下载地址:MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 下载完成后,得到一个名为 mingw-get-setup.exe 的安装文件。双击运行,安装即可。 …...
【初阶数据结构】复杂度算法题篇
旋转数组 力扣原题 方案一 循环K次将数组所有元素向后移动⼀位(代码不通过) 时间复杂度O(n2) 空间复杂度O(1) void rotate(int* nums, int numsSize, int k) {while (k--) {int end nums[numsSize - 1];for (int i numsSize - 1; i > 0; i--) {nums[i] num…...
20240725项目的maven环境报红-重新配置maven
1.在编辑器里面打开项目,导入源码 (1)找到项目的地址C:\Users\zzz\IdeaProjects\datasys,然后右击用idea编辑器打开。 (2)idea中上菜单栏打开open,然后输入file,选择源代码文件 2.…...
若依 ruoyi poi Excel合并行的导入
本文仅针对文字相关的合并做了处理 ,图片合并及保存需要另做处理!! 目标:Excel合并行内容的导入 结果: 1. ExcelUtil.java 类,新增方法:判断是否是合并行 /*** 新增 合并行相关代码:…...
优化算法:1.遗传算法(GA)及Python实现
一、定义 遗传算法就像是在模拟“优胜劣汰”的进化过程,通过选择最优秀的个体,交配产生下一代,并引入一定的变异,逐步优化解决问题。 二、具体步骤 初始化种群(Initialization): 假设你要找到一个迷宫的最佳出口路径。…...
企业化运维(8)Docker容器技术
###1.Docker介绍### 什么是Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间…...
Unity C#底层原理(二)
委托 方法的容器:委托可以存储一个或多个方法的引用。可以使用委托对象来调用这些方法。函数/方法的变量类型:委托类型可以像变量一样声明和使用,存储方法的引用。存储、传递方法:委托可以作为参数传递给方法,也可以作…...
计算机网络-配置路由器ACL(访问控制列表)
配置访问控制列表ACL 拓扑结构 拓扑结构如下: 要配置一个ACL,禁止PC0访问PC3,禁止PC4访问PC0,其它正常。 配置Router0 配置接口IP地址: interface fastethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shu…...
51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计
STC89C52R基于C51嵌入式点阵广告屏的设计 1 概述2 LED点阵介绍2.1 特点和优势2.2 工作原理:2.3 使用方法: 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路3.3 74HC595 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 总结 配套示例程序 1…...
VLC输出NDI媒体流
目录 1. 下载安装VLC Play 2. 首先在电脑上安装NDI Tools 3. 运行VLC进行输出配置 4. 播放视频 5. 验证 (1)用Studio Monitor验证 (2)用OBS验证 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量…...
WiFi 局域网通信 - 发现服务和解析
1. nsdManager nsdManager requireContext().getSystemService(Context.NSD_SERVICE) as NsdManager2. NsdManager.DiscoveryListener 注意:在onStartDiscoveryFailed 和 onStopDiscoveryFailed里不要调用nsdManager.stopServiceDiscovery(this) 方法࿰…...
ChatGPT建议前端学习计划
HTML&CSS基础 - 学习HTML标签、CSS属性、页面布局等基础知识 JavaScript基础 - 学习变量、数据类型、控制流、函数等基础知识 jQuery - 学习如何使用jQuery处理文档对象模型(DOM)、事件、动画等 Ajax - 全称为 Asynchronous JavaScript and XML&…...
YOLO5项目目录最强解析
YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构,以下是对每个目录和文件的解释: 目录 📁 .github: 存放 GitHub 相关配置和文件,如 GitHub Actions 工作流文件、Issue 模板等,用于自动化构建和持续集成等功…...
【python】sklearn基础教程及示例
【python】sklearn基础教程及示例 Scikit-learn(简称sklearn)是一个非常流行的Python机器学习库,提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述: 1. 安装scikit-learn 首先,确保你已经安装了Python和…...
Linux:传输层(2) -- TCP协议(2)
目录 1. 流量控制 2. 滑动窗口 3. 拥塞控制 4. 延迟应答 5. 捎带应答 6. 面向字节流 7. 粘包问题 8. TCP异常情况 1. 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快 , 导致接收端的缓冲区被打满 , 这个时候如果发送端继续发送 , 就会造成丢包, 继而引…...
AcWing 802. 区间和
var说明add存储了插入操作,在指定 x x x下标所在位置 a [ x ] c a[x]c a[x]cquery是求 [ L , R ] [L,R] [L,R]区间和用到的数组,最后才用到alls 是存储离散化之后的值 , 对于会访问到的每个下标,统统丢到 a l l s 里面 ,会把 x 和 [ L , R …...
实验2-2-1 温度转换
#include<stdio.h> #include <math.h> int main(){int c,f150;c5*(f-32)/9;printf("fahr 150, celsius %d",c); }...
Spark实时(六):Output Sinks案例演示
文章目录 Output Sinks案例演示 一、File sink 二、Memory Sink 三、Foreach Sink 1、foreachBatch 2、foreach Output Sinks案例演示 当我们对流式…...
在SQL编程中DROP、DELETE和TRUNCATE的区别
在SQL编程中,DROP、DELETE和TRUNCATE都是用于删除数据的命令,但它们之间有着显著的区别,主要体现在它们删除数据的范围、操作的不可逆性、对表结构的影响、性能以及事务日志的影响上。 DROP: 作用:DROP命令用于删除整个表及其所有…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
