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命令用于删除整个表及其所有…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
