Qt——读取文件进度条

mythread.h

cpp 复制代码
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class myThread : public QThread
{
    Q_OBJECT
public:
    myThread(QObject* parent=nullptr);
protected:
    virtual void run() override;
signals:
    void readSig();
};

#endif // MYTHREAD_H

mythread.cpp

cpp 复制代码
#include "mythread.h"

myThread::myThread(QObject* parent):QThread(parent){}

void myThread::run()
{
    while(1){
        emit readSig();
        QThread::msleep(10);
    }
}

myFile类

cpp 复制代码
#include "myfile.h"

myFile::myFile()
{

}

myFile::myFile(const QString &name):QFile(name){}

void myFile::setFilename(const QString &filename)
{
    this->rename(filename);
}

自定义主窗口要实现的功能

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    t = new myThread(this);//定义线程

    //qss指令的编写
    QString qss = "QSlider{border:2px solid;}"
            "QSlider::sub-page:horizontal { background-color: green; }"
            "QSlider::groove:horizontal { background-color: gray; }";
    
    //自定义进度条样式
    ui->horizontalSlider->setStyleSheet(qss);
    
    //等待接收trigger信号,当接受到trigger信号触发槽函数startSlot;
    QObject::connect(this,&Widget::trigger,this,&Widget::startSlot);//链接触发读取信号(触发t->start())
    
    //等待接收线程myThread中的readSig信号,当接受到readSig信号触发槽函数:readSlot;
    QObject::connect(t,&myThread::readSig,this,&Widget::readSlot);//链接线程读取信号和Widget槽函数
}

Widget::~Widget()
{
    t->terminate();
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    //点击按钮就打开文件对话框
    QString fileName =QFileDialog::getOpenFileName(this,"打开文件","D:/pic","Text Files (*.*);;All Files (*)");
    if(fileName.isEmpty()){
        return;
    }else{
        emit trigger();//发送下载信号
        fd = new QFile(fileName);//QFile设置文件名
        fd->open(QIODevice::ReadOnly);//QFile打开文件
        
        //将进度条的范围设置为文件的大小
        ui->horizontalSlider->setRange(0,fd->size());//将进度条的范围设置为文件的大小
    }
}

void Widget::startSlot()//启动线程,线程执行每隔10秒发送readSig信号
{
   t->start();
}

void Widget::readSlot()
{
    btarr=fd->read(maxsize);//一次读取maxsize字节(读取速度)
    size+=maxsize;
    ui->horizontalSlider->setValue(size);//读取多少进度条增长多少
    if(size>=fd->size()){
        qDebug() << "读取完毕";
        fd->close();//关闭文件指针
        size=0;
        t->terminate();//关闭线程
    }
}

主窗口类的私有成员变量

cpp 复制代码
private:
    Ui::Widget *ui;
    QFile* fd;
    QByteArray btarr;
    qint64 maxsize=1024;
    myThread* t;
    qint64 size=0;

主窗口类的成员信号

cpp 复制代码
signals:
    void trigger();

主窗口类的成员方法-----槽函数

cpp 复制代码
public slots:
    void readSlot();
    void startSlot();
相关推荐
快乐的划水a7 小时前
组合模式及优化
c++·设计模式·组合模式
星星火柴9368 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑9 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
阿巴~阿巴~11 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
旺小仔.12 小时前
双指针和codetop复习
数据结构·c++·算法
jingfeng51413 小时前
C++ STL-string类底层实现
前端·c++·算法
郝学胜-神的一滴13 小时前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
努力努力再努力wz14 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
瓦特what?15 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
祁同伟.16 小时前
【C++】动态内存管理
开发语言·c++