QT 作业 C++ day5

作业

代码

MyQThread.h

class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread(QObject *parent = nullptr);
protected:
    void run() override;
signals:
    //向ui界面发送的 "复制进度" 的信号
    void copy_process_signal(int index);    
public slots:
    // "复制"信号的槽
    void do_copyfile_slots(QString oldfilename,QString newfilename);
private:
    QString oldfilename;
    QString newfilename;
    bool start_copy_flag=0;
};

#endif // MYTHREAD_H

MyQThread.cpp

MyThread::MyThread(QObject *parent)
    :QThread(parent)
{

}

// "槽"
void MyThread::do_copyfile_slots(QString oldfilename,QString newfilename)
{
    //进入此函数,说明ui界面拖入了文件,需要进行文件复制
    this->oldfilename=oldfilename;  //源文件路径
    this->newfilename=newfilename;  //目标文件路径
    start_copy_flag=1;  //打开标志位
}

void MyThread::run()
{
    qDebug() << "子进程进入run函数";
    while(1)
    {
        if(start_copy_flag)
        {;
            //文件复制(准备阶段)
            QFile old_file(oldfilename);      //拆功能键QFile对象
            QFile new_file(newfilename);
            old_file.open(QIODevice::ReadOnly);    //打开文件
            new_file.open(QIODevice::WriteOnly);
            char data[4096];
            qint64 filesize = old_file.size();     //文件总大小
            qint64 readsize=0;                     //已读大小
            int index_backup=0;                    //任务进度
            
            //文件复制(执行阶段)
            while(1)
            {
                //读取数据
                qint64 real_read__size = old_file.read(data,4096);

                //判断是否读完
                if(real_read__size == 0){break;}        //读取到的字节数为0 说明读取完毕,退出

                //计算"处理进度"
                readsize+=real_read__size;              //已经读取的字节总数
                int index =readsize * 100 / filesize;   //"处理进度"
                
                //告知ui界面 当前“处理进度”
                if(index - index_backup > 1)    //仅当"处理进度"发生变化x时
                {
                    copy_process_signal(index); //才发出信号,让ui重新回执进度
                    qDebug() << "复制进度" << index << " 读取总字节" << readsize << " 文件总大小" << filesize;
                }
                
                //写入数据
                new_file.write(data,real_read__size);
            }
            copy_process_signal(100);         //运行到此说明复制完毕,手动将进度设置为100
            old_file.close();
            new_file.close();
            qDebug() << "复制完毕";
            start_copy_flag = 0;    //关闭标志位
        }
    }
    exec(); // 启动事件循环
}

Widget.h

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void dropEvent(QDropEvent *event) override;             //释放
    void dragEnterEvent(QDragEnterEvent *event) override;   //进入
private slots:
    void update_copy_process(int index);
signals:
    void copyfile_signal(QString oldfilename,QString newfilename);
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

Widget.cpp

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setAcceptDrops(1);    //设置允许拖拽
    MyThread* thread = new MyThread(this);

    // "复制文件"
    QObject::connect(this,&Widget::copyfile_signal,thread,&MyThread::do_copyfile_slots);
    // "任务进度"
    QObject::connect(thread,&MyThread::copy_process_signal,this,&Widget::update_copy_process);

    //滑块相关设置
    QString qss = "QSlider::sub-page{background-color:blue} QSlider::groove:horizontal{background-color:white}";
    ui->slider->setStyleSheet(qss);

    thread->start();
}

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

//拖入
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    event->acceptProposedAction();  //接收拖入
}

//释放
void Widget::dropEvent(QDropEvent *event)
{
    //从事件中解析文件名
    const QMimeData* mData = event->mimeData();      //获取其中mimeData
    QList<QUrl> urls_list = mData->urls();           //转为urls_list 文件信息村饭到这个容器中
    QUrl url = urls_list[0];                         //读取容器中第一条数据
    QString oldfilename = url.toLocalFile();         //url 转 "文件名"
    
    //从对话框中获取文件名
    QString newfilename = QFileDialog::getSaveFileName(this,"保存文件","E:\\DAY5","AllFiles (*);;Images (*.png *.xpm *.jpg)");

    //数据部分,交由进程处理
    copyfile_signal(oldfilename,newfilename);
}

//槽函数(子进程任务进度 信号)
void Widget::update_copy_process(int index)
{
    //设置进度条
    ui->slider->setValue(index);
}

效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

24、如何在C++中创建和管理线程?【中高频】 -

创建线程对象&#xff1a; //无参构造&#xff0c;该线程对象没有关联任何线程函数&#xff0c;也就是它没有启动任何线程:thread t1;//... t1 thread(func, 10);//移动构造&#xff08;调用移动赋值函数&#xff09;t1.join();//含参构造thread t1(func1, 1, 10);//thread 提…

【Altium】22.11版本后如何导出Gerber镜像层

1、 文档目标 解决 22.11 版本后如何导出 Gerber 镜像层的问题 2、 问题场景 Gerber 导出旧版本&#xff0c;在 AD 22.11 之前的 Gerber 导出中是存在镜像层的选择。 图 1 软件更新至 AD22.11 及之后版本&#xff0c;在 Gerber 导出设置中无法选择层镜像进行导出。 图 2 3、…

配置 Thunderbird 以使用 QQ 邮箱

配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 &#xff0c;thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样&#xff0c;导致看起来不太方便&#xff0c;所以这里写一篇博客。不同版本的 thu…

wxWidgets GUI 跨平台 入门学习笔记

准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…

DeepSeek系列模型技术报告的阅读笔记

DeepSeek系列模型技术报告的阅读笔记 之前仔细阅读了DeepSeek系列模型的主要技术方面内容与发展脉络&#xff0c;以下是DeepSeek系列模型技术报告的笔记&#xff0c;有错误的地方欢迎指正&#xff01; 文章目录 DeepSeek系列模型技术报告的阅读笔记GQADeepseek MoEAbstractIn…

海思Hi3516DV300交叉编译opencv

OpenCV是一个开源的跨平台计算机视觉库&#xff0c;支持C、Python等多种语言&#xff0c;适用于图像处理、目标检测、机器学习等任务。其核心由C编写&#xff0c;高效轻量&#xff0c;提供实时视觉处理功能&#xff0c;广泛应用于工业自动化、医疗影像等领域。 1 环境准备 1…

React + React-intl @3.xx + TypeScript

声明&#xff1a;此篇文章使用的版本是 "react-intl": "^3.12.0"。 因为react-intl3.xx版本相较于react-intl2.xx版本差别较大&#xff0c;有些API是break change, 所以这篇文章的实现方式&#xff0c;不适用于react-intl2.xx版本。 一: 安装react-intl np…

(二 十 二)趣学设计模式 之 备忘录模式!

目录 一、 啥是备忘录模式&#xff1f;二、 为什么要用备忘录模式&#xff1f;三、 备忘录模式的实现方式四、 备忘录模式的优缺点五、 备忘录模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能 2025/3/7 13:56 缘起&#xff1a;我司地面站需要实现“太网络共享功能”功能。电脑PC要像连接WIFI热点一样连接在Android设备/平板电脑上来实现上网功能/数据传输。 Android设备/平板电脑通过4G/WIFI来上网。…

HMC7043和HMC7044芯片配置使用

一,HMC7043芯片 MC7043独特的特性是对14个通道分别进行独立灵活的相位管理。所有14个通道均支持频率和相位调整。这些输出还可针对50 Ω或100 Ω内部和外部端接选项进行编程。HMC7043器件具有RF SYNC功能,支持确定性同步多个HMC7043器件,即确保所有时钟输出从同一时钟沿开始…

RSA的理解运用与Pycharm组装Cryptodome库

1、RSA的来源 RSA通常指基于RSA算法的密码系统&#xff0c;令我没想到的是&#xff0c;其名字的来源竟然不是某个含有特别意义的单词缩写而成&#xff08;比如PHP&#xff1a;Hypertext Preprocessor(超文本预处理器)&#xff09;&#xff0c;而是由1977年提出该算法的三个歪果…

嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)

目录 一、根文件系统的原理与重要性 二、根文件系统的构成 2.1. 基本目录结构 2.2. 核心组件 2.3. 设备驱动 2.4. 网络工具和协议 2.5. 调试工具 三、根文件系统的制作方法 四、根文件系统的测试 五、构建根文件系统的关键技术 5.1. 最小化构建工具 5.2. 关键配置文…

SpringBoot知识点及其源码解析(1)

自动配置 以web启动器为例&#xff0c;在spring-boot-starter-test-3.4.3.pom文件整合了一系列的依赖&#xff0c;那么当启动程序后会不会进行自动配置&#xff1f;当获取到这个容器后&#xff0c;可以从容器中获取所有bean的名字&#xff0c;此时就可以在控制台发现很多bean的…

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全&#xff1a;Cyber Security&#xff08;网络空间安全&#xff09; 网络空间有独立且相互依存的信息基础设施和网络组成&#xff0c;包括互联网、电信网、计算机系统、嵌入式处理器和控…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

第六课:数据存储三剑客:CSV/JSON/MySQL

在Python的数据存储与处理领域&#xff0c;CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用&#xff0c;无论是简单的数据交换、轻量级的数据存储&#xff0c;还是复杂的关系型数据库管理&#xff0c;都能找到它们的身影。本文将详…

CSS设置文字渐变色样式(附带动画效果)

最近用DeepSeek问了一下如何使用css设置文字的渐变色效果&#xff0c;并且希望可以有动画效果&#xff0c;然而DeepSeek给出的答案动画效果有些bug&#xff0c;于是自己动手改了改。 下面是CSS样式设置代码 .gradient-text {background-image: linear-gradient(to right, #ff6…

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合&#xff08;3D-Video Integration&#xff09;是一种将虚拟三维模型无缝嵌入实拍视频场景的技术&#xff0c;广泛应用于影视特效、增强现实&#xff08;AR&#xff09;、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…

electron + vue3 + vite 主进程到渲染进程的单向通信

用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目&#xff1a;https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程&#xff08;单向&#xff09; 以Electron官方文档给出的”主进程主动触发动作&#xff0c;发送内容给渲…

第八节:基于Winform框架的串口助手小项目---完结优化《C#编程》

C# 实战串口助手完成&#xff01; ----------------------------不竭余力&#xff0c;方能成长&#xff01;-----------WHAPPY 源码&#xff1a;我会分享开源平台&#xff0c;可以艾特me&#xff01;&#xff08;2025/3/5&#xff09;时间紧张任务中&#xff01; 文章上所说的…