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();
相关推荐
哇哈哈202121 小时前
信号量和信号
linux·c++
多恩Stone21 小时前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马1 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝1 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc1 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
问好眼1 天前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛
yyjtx1 天前
DHU上机打卡D31
开发语言·c++·算法
czxyvX1 天前
020-C++之unordered容器
数据结构·c++
会编程的土豆1 天前
2.25 做题
数据结构·c++·算法
Ljwuhe1 天前
类与对象(中)——运算符重载
开发语言·c++