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();
相关推荐
古月-一个C++方向的小白6 小时前
C++11之lambda表达式与包装器
开发语言·c++
tanyongxi668 小时前
C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
开发语言·c++
斯是 陋室10 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
tju新生代魔迷11 小时前
C++:list
开发语言·c++
HHRL-yx11 小时前
C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
网络·c++·tcp/ip
tomato0911 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法
每一天都要努力^14 小时前
C++拷贝构造
开发语言·c++
NoirSeeker15 小时前
在windows平台上基于OpenHarmony sdk编译三方库并暴露给ArkTS使用(详细)
c++·windows·arkts·鸿蒙·交叉编译
落羽的落羽15 小时前
【C++】(万字)一文看懂“类与对象”
c++
闻缺陷则喜何志丹16 小时前
【带权的并集查找】 P9235 [蓝桥杯 2023 省 A] 网络稳定性|省选-
数据结构·c++·蓝桥杯·洛谷·并集查找