qt--做一个拷贝文件器

news2024/11/15 20:01:11

一、项目要求

使用线程完善文件拷贝器的操作
  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_OBJECT

public:
    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("文件可读");
   else
       ui->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() << "资源已释放";
 
}

四、实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hi-Fix 介绍

一、HIFIX 定义与功能 HIFIX是连接安装在自动检测装置&#xff08;Tester&#xff09;本体内的功能卡(Resource board)和承载被测设备(Device)探针卡&#xff08;Probe card&#xff09;的媒介&#xff0c;将来自检测装置的大量测试信号统一发送到被测设备(Device)。 HiFIX 能…

Java语言程序设计——篇八(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; Java常用核心类 主要内容Object: 终极父类toString( )方法equals( )方法getClass( )方法hashCode( )方法clone( )方法finalize( )方法实战演练 …

CentOS6.0安装telnet-server启用telnet服务

CentOS6.0安装telnet-server启用telnet服务 一步到位 fp"/etc/yum.repos.d" ; cp -a ${fp} ${fp}.$(date %0y%0m%0d%0H%0M%0S).bkup echo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.163.com/centos-vault/6.0/os/$basearch/http://mirrors.a…

使用echo写入多行文字到文件时换行的处理

目标 想使用echo写入如下内容到文件program.c里 #include<stdio.h> int main(){printf("hello!\n"); } 需要处理 1、如何处理行换 2、代码中的换行如何处理 实际例子 创建文件夹 mkdir test cd test chmod 777 . 创建文件写入内容 查看 cat -n program.c…

SLS 数据加工全面升级,集成 SPL 语法

作者&#xff1a;灵圣 数据加工概述 在系统开发、运维过程中&#xff0c;日志是最重要的信息之一&#xff0c;其最大的优点是简单直接。不过在整个日志的生命周期里有一对很难调和的矛盾&#xff1a;输出和采集日志要求尽可能的简单便捷 vs 日志分析时需要数据格式化并能够按…

【SpringBoot】3 项目配置及部署

配置文件配置 将 application.properties 改为 application.yml &#xff0c;写法不一样&#xff0c;本人比较习惯用 yaml 格式。 配置项目名称和项目端口号。 application.yml server:port: 8888 spring:application:name: system配置外置 Servlet 容器 如果要在 Tomcat 容器…

数据结构·AVL树

1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果存数据时接近有序&#xff0c;二叉搜索将退化为单支树&#xff0c;此时查找元素效率相当于在顺序表中查找&#xff0c;效率低下。因此两位俄罗斯数学家 G.M.Adelson-Velskii 和E.M.Landis 在1962年发明了一种解…

音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件

在文章《音视频入门基础&#xff1a;PCM专题&#xff08;1&#xff09;——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为WAV格式的音频文件&#xff1a; ./ffmpeg -ar 44100 -ac 2 -f s16le -acodec pcm_s16le -i aud…

「Ant Design」Antd 中卡片如何完全不展示内容区域、按需展示内容区域、不展示标题

前言 下面是默认的 Antd 卡片&#xff0c;由以下区域组成 处理 Antd 的 Card 展示形式大致有下面三种 卡片完全不展示内容区域 const App () > (<Card title"Default size card" extra{<a href"#">More</a>} style{{ width: 300 }}b…

工厂数字化转型,该如何建设数字孪生车间?

在工业4.0的浪潮下&#xff0c;数字化转型已成为工厂升级的必然趋势&#xff0c;而数字孪生技术的引入则为这一转型注入了强大动力。智汇云舟作为数字孪生行业头部企业和视频孪生技术首倡者&#xff0c;以创新的视角和前沿的技术&#xff0c;为数字工业建设助力&#xff0c;给众…

《昇思25天学习打卡营第2天|张量》

张量其实就是矩阵&#xff0c;在python中主要是使用numpy这个库来操作&#xff0c;然后再mindspore中一般使用tensor对象作为张量的载体 张量如果维度只有二维的话可以简单理解为数据库中的表&#xff0c;但是如果是3维4维主要是在列表中增加列表项比如 【 【1&#xff0c;1】…

C++ //练习 15.28 定义一个存放Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。

C Primer&#xff08;第5版&#xff09; 练习 15.28 练习 15.28 定义一个存放Quote对象的vector&#xff0c;将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&am…

【C++笔试强训】day01

数字统计 思路 用%10取出个位的数字&#xff0c;用/10迭代。 代码 #include <iostream> using namespace std;int main() {int l, r, res 0;cin >> l >> r;for (int i l; i < r; i){int x i;while (x){if (x % 10 2) res;x / 10;}}cout << r…

AttributeError: ‘WandbLogger‘ object has no attribute ‘bbox_interval‘

一、问题描述 跑yolov5时&#xff0c;运行代码出现以下报错 AttributeError: WandbLogger object has no attribute bbox_interval 二、问题原因 可能是版本的问题&#xff0c;需要把wandb关闭 三、解决方法 在路径 \yolov5\utils\loggers 文件夹下的 _init__.py文件中19…

【MySQL】记录MySQL加载数据(LOAD DATA)

MySQL LOAD DATA 一、背景二、模拟生成用户信息三、加载到mysql表3.1、建表语句3.2 加载数据3.3、查看结果 一、背景 现在有个需求是将用户信息存入student.data文件中&#xff0c;在现在load到数据库中 二、模拟生成用户信息 假设用户信息&#xff0c;包含姓名&#xff0c;…

使用PyTorch导出JIT模型:C++ API与libtorch实战

PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1&#xff1a;导出模型 首先我们进行第一步&#xff0c;用 Python API 来导出模型&#xff0c;由于本文的重点是在后面的部署…

AR 眼镜之-蓝牙电话-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 蓝牙电话 来电铃声 1. &#x1f531; 技术方案 1.1 结构框图 1.2 方案介绍 1.3 实现方案 步骤一&#xff1a;屏蔽原生蓝牙电话相关功能 步骤二&#xff1a;自定义蓝牙电话实现 2. &#x1f4a0; 屏蔽原生蓝牙电话相关功能 …

深入解读 Java 中的 `StringUtils.isNotBlank` 与 `StringUtils.isNotEmpty`

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

【支持语言模型和视觉语言模型的推理引擎sglang】

介绍 sglang是一个AI推理引擎&#xff0c;是一个专门为大语言模型和视觉语言模型设计的高效服务框架。 就像F1赛车需要顶级发动机一样&#xff0c;大语言模型也需要高效的推理引擎来发挥潜力。 而sglang正是这样一个性能怪兽。 根据LMSys组织的官方公告&#xff0c;最新的s…

Docker(十)-Docker运行elasticsearch7.4.2容器实例以及分词器相关的配置

1.下载镜像 1.1存储和检索数据 docker pull elasticsearch:7.4.2 1.2可视化检索数据 docker pull kibana:7.4.22.创建elasticsearch实例 创建本地挂载数据卷配置目录 mkdir -p /software/elasticsearch/config 创建本地挂载数据卷数据目录 mkdir -p /software/elasticse…