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命令用于删除整个表及其所有…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
