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

QT实现拷贝复制文件操作 QT5.12.3环境 C++实现

案例需求:利用QT线程操作,实现拷贝复制文件操作


代码:

myfile.h

#ifndef MYFILE_H
#define MYFILE_H

#include <QObject>
#include <QDebug>
#include <QThread>
#include <QFile>
#include <QtWidgets>
class MyFile : public QObject
{
    Q_OBJECT
public:
    explicit MyFile(QObject *parent = nullptr);
    void thread_file(QString path);
signals:
    void my_signal(); // 失败信号
    void success_signal(); // 成功信号
public slots:
};

#endif // MYFILE_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QThread>
#include "myfile.h"
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();
signals:
    void sendsignal(QString path);
private:
    Ui::Widget *ui;
    QThread *thread;
    MyFile *file;
};

#endif // WIDGET_H

myfile.cpp

#include "myfile.h"

MyFile::MyFile(QObject *parent) : QObject(parent)
{

}

void MyFile::thread_file(QString path)
{
    if(path.isEmpty()){
        qDebug()<<"取消选择"<<endl;
        emit my_signal();
        return ;
    }
    else{
        qDebug()<<path<<endl;
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly)){
            qDebug()<<"读取失败";
            emit my_signal();
            return ;
        }
        QString writepath = "./writefile.cpp";
        QFile writefile(writepath);
        if(!writefile.open(QIODevice::WriteOnly|QIODevice::Truncate)){
            qDebug()<<"新建失败";
            emit my_signal();
            return ;
        }
        while(!file.atEnd()){ // 拷贝
            QByteArray buf;
            file.read(1024);
            writefile.write(buf);
        }
        // 关闭文件
        file.close();
        writefile.close();
        emit success_signal();
    }
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QThread>
#include "myfile.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    thread = new QThread(this);
    file = new MyFile;
    file->moveToThread(thread);
    //connect(thread,&QThread::started,file,&MyFile::thread_file);
    connect(this,&Widget::destroyed,this,[=](){
        thread->quit();
        thread->wait();
    });
    connect(file,&MyFile::my_signal,this,[=](){ // 只能在主线程对界面进行操作
         this->ui->label->setText("COPY失败");
     });
    connect(file,&MyFile::success_signal,this,[=](){
        this->ui->label->setText("COPY完成");
    });
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,tr("打开文件"),"./","Text filex(*.cpp)");
    connect(this,&Widget::sendsignal,file,&MyFile::thread_file);
    emit sendsignal(path);
    this->ui->label->setText("开始拷贝");
    thread->start();
}

ui


输出:


http://www.kler.cn/a/410346.html

相关文章:

  • JVM-类文件结构
  • STM32WB55RG开发(5)----监测STM32WB连接状态
  • MTK主板_安卓主板方案_MTK联发科主板定制开发
  • 公网弹性绑定负载均衡收费吗?
  • el-table vue3统计计算数字
  • 机器学习之量子机器学习(Quantum Machine Learning, QML)
  • 分布式kettle调度平台v6.4.0新功能介绍
  • [UE5学习] 一、使用源代码安装UE5.4
  • MySQL:DATEDIFF()计算两个日期天数之差
  • 高速缓存(Cache)与主内存(Memory)
  • C#基础上机练习题
  • 【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!
  • Qt——实现文本根据字体+控件长度自适应更改为:内容+...
  • 机器学习-----变色龙算法(Chameleon Algorithm)
  • 大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
  • 免费实用在线AI工具集合 - 加菲工具
  • 在 MySQL 记录操作日志,通常有几种方法可以实现。
  • 基于微信小程序的空巢老人健康管理系统
  • 基于Java Springboot个人健康管理系统
  • 3.STM32之通信接口《精讲》之IIC通信---MPU6050介绍
  • 【Linux】DHCP服务实验
  • 层次聚类(Hierarchical Clustering)详解
  • 如何将APK预置到Android系统
  • Java项目实战II基于微信小程序的图书馆自习室座位预约平台(开发文档+数据库+源码)
  • 《硬件架构的艺术》笔记(七):处理字节顺序
  • 基于Java Springboot干洗店预约洗衣系统