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();
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·2 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码2 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int2 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++