当前位置: 首页 > news >正文

qt--做一个拷贝文件器

一、项目要求

使用线程完善文件拷贝器的操作
  1. 主窗口不能假死
  2. 主窗口进度条必须能动
  3. 改写文件大小的单位(自适应)

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() << "资源已释放";}

四、实验结果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解Spring依赖注入与生命周期管理
  • 取消Idea文件夹的自动合并操作!
  • Unity C#底层原理(二)
  • 【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’
  • Tomcat响应数据过程
  • 背单词工具(C++)
  • stm32番外-----0.96寸OLED播放电影《你的名字》
  • vue、react前端框架实现TodoList页面案例
  • HTTP模块(二)
  • “论大数据处理架构及其应用”写作框架,软考高级论文,系统架构设计师论文
  • HTML常见标签——超链接a标签
  • 10 VUE Element
  • 【概率论】-2-概率论公理(Axioms of Probability)
  • pyqt designer使用spliter
  • NumpyPandas:Pandas库(50%-100%)
  • [笔记] php常见简单功能及函数
  • 【技术性】Search知识
  • express.js的介绍及使用
  • markdown编辑器简评
  • nginx 负载服务器优化
  • Vue 重置组件到初始状态
  • vue-cli在webpack的配置文件探究
  • 百度地图API标注+时间轴组件
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊flink的TableFactory
  • 驱动程序原理
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 一道面试题引发的“血案”
  • 一文看透浏览器架构
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #android不同版本废弃api,新api。
  • #pragma multi_compile #pragma shader_feature
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (26)4.7 字符函数和字符串函数
  • (6)STL算法之转换
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (SERIES12)DM性能优化
  • (八)Flask之app.route装饰器函数的参数
  • (四)事件系统
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net 反编译_.net反编译的相关问题
  • .Net(C#)自定义WinForm控件之小结篇
  • .net反混淆脱壳工具de4dot的使用
  • .NET企业级应用架构设计系列之结尾篇
  • .net专家(高海东的专栏)
  • ::before和::after 常见的用法
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)