QT-异步编程

1.进度条通过线程动起来

mythread.h

cpp 复制代码
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QSlider>
class myThread : public QThread
{
    Q_OBJECT
public:
    myThread(QObject* parent=nullptr);
protected:
    virtual void run() override;
private:

signals:
    emit void sendMove();
};

#endif // MYTHREAD_H

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H
#include "mythread.h"
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    myThread* thread;
    QString qss;
public slots:
    void recMove();
private slots:
    void on_pushButton_clicked();
};
#endif // WIDGET_H

mythread.cpp

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

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


}

void myThread::run()
{
    while(1)
    {
        this->msleep(100);
        emit sendMove();
    }
}

widget.cpp

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    thread = new myThread(this);
    qss ="QSlider::sub-page{background-color:blue} QSlider::groove{background-color:black} ";
    ui->horizontalSlider->setStyleSheet(qss);
    QObject::connect(thread,&myThread::sendMove,this,&Widget::recMove);//传递滑块移动
}

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


void Widget::recMove()
{
    int currentValue = ui->horizontalSlider->value();
    ui->horizontalSlider->setValue(currentValue + 1);
}


void Widget::on_pushButton_clicked()
{
    thread->start();
}

2.使用QFileDialog 或者 拖放事件 + QT文件IO + QT线程

实现一个文件复制功能,要求能够复制大小超过800mb的文件

额外要求:可以在文件拷贝的时候,追加一个进度条显示拷贝了多少文件内容

mythread.h

cpp 复制代码
#ifndef MYTHREAD_H
#define MYTHREAD_H
 
#include <QThread>
#include <QFile>
 
class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(QObject* parent = nullptr);
    void setFileInfo(const QString& path, const QString& copypath);
 
signals:
    void signCopyIng(int value);
    void signCopyEnd(bool success);
 
protected:
    void run() override;
 
private:
    QString path;   // 源文件路径
    QString copypath;  // 目标文件路径
};
 
#endif // MYTHREAD_H

mythread.cpp

cpp 复制代码
#include "mythread.h"
#include <QDebug>
 
myThread::myThread(QObject *parent) : QThread(parent) {}
 
void myThread::setFileInfo(const QString& path, const QString& copypath) {
    this->path = path;
    this->copypath = copypath;
}
 
void myThread::run() {
    QFile srcFile(path);
    QFile destFile(copypath);
 
    if (!srcFile.open(QIODevice::ReadOnly)) {
        emit signCopyEnd(false);
        return;
    }
 
    if (!destFile.open(QIODevice::WriteOnly)) {
        srcFile.close();
        emit signCopyEnd(false);
        return;
    }
 
    const qint64 totalSize = srcFile.size();
    qint64 copiedSize = 0;
    const int bufferSize = 1024 * 1024;
 
    while (!srcFile.atEnd()) {
        if (isInterruptionRequested()) break;
 
        QByteArray buffer = srcFile.read(bufferSize);
        qint64 writeSize = destFile.write(buffer);
 
        if (writeSize != buffer.size()) {
            break;
        }
 
        copiedSize += writeSize;
        int value = static_cast<int>(copiedSize * 100 / totalSize);
        emit signCopyIng(value);
    }
 
    srcFile.close();
    destFile.close();
 
    bool success = (copiedSize == totalSize);
    emit signCopyEnd(success);
}

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include "mythread.h"
#include <QTimer>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
private:
    Ui::Widget *ui;
    myThread* thread;
 
 
 
private slots:
    void onCopyIng(int value);
    void onCopyEnd(bool success);
 
    void on_pushButton_clicked();
};
 
#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QMessageBox>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , thread(new myThread(this))
{
    ui->setupUi(this);
 
 
    QString qss ="QSlider::sub-page{background-color:blue} QSlider::groove{background-color:black} ";
      
 
    ui->horizontalSlider->setEnabled(false); // 禁用进度条交互
    ui->horizontalSlider->setStyleSheet(qss);
 
    ui->horizontalSlider->setRange(0, 100);
    ui->horizontalSlider->setValue(0);
    ui->label->setText("就绪");
 
    connect(thread, &myThread::signCopyIng, this, &Widget::onCopyIng);
    connect(thread, &myThread::signCopyEnd, this, &Widget::onCopyEnd);
}
 
Widget::~Widget()
{
    if (thread->isRunning()) {
        thread->requestInterruption();
        thread->wait();
    }
    delete ui;
}
 
void Widget::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this, "选择源文件");
    if (path.isEmpty()) return;
 
    QString copypath = QFileDialog::getSaveFileName(this, "保存文件");
    if (copypath.isEmpty()) return;
 
    ui->horizontalSlider->setValue(0);
    ui->label->setText("复制中...0%");
    ui->pushButton->setEnabled(false);
 
    thread->setFileInfo(path, copypath);
 
    thread->start();
}
 
void Widget::onCopyIng(int value)
{
    ui->horizontalSlider->setValue(value);
    ui->label->setText(QString("复制中...%1%").arg(value));
}
 
void Widget::onCopyEnd(bool success)
{
    ui->pushButton->setEnabled(true);
    if (success) {
        QMessageBox::information(this, "完成", "文件复制成功!");
        ui->label->setText("复制完成");
    } else {
        QMessageBox::critical(this, "错误", "文件复制失败!");
        ui->label->setText("复制失败");
    }
    ui->horizontalSlider->setValue(0);
}
相关推荐
我命由我123459 小时前
CesiumJS 案例 P35:添加图片图层(添加图片数据)
开发语言·前端·javascript·css·html·html5·js
zeijiershuai9 小时前
Java 会话技术、Cookie、JWT令牌、过滤器Filter、拦截器Interceptor
java·开发语言
MATLAB代码顾问10 小时前
多种时间序列预测算法的MATLAB实现
开发语言·算法·matlab
Wallace Zhang10 小时前
QT开发汇总(更新2025.11.12)
qt·pyside6
m0_7369270410 小时前
2025高频Java后端场景题汇总(全年汇总版)
java·开发语言·经验分享·后端·面试·职场和发展·跳槽
FAREWELL0007511 小时前
Lua学习记录(3) --- Lua中的复杂数据类型_table
开发语言·学习·lua
IT北辰11 小时前
Python实现居民供暖中暖气能耗数据可视化分析(文中含源码)
开发语言·python·信息可视化
KWTXX11 小时前
组合逻辑和时序逻辑的区别
java·开发语言·人工智能
●VON11 小时前
补充说明:Windows 完全可以开发 Qt 鸿蒙应用!(附专属适配方案)
windows·qt·华为·harmonyos·鸿蒙
wjs202411 小时前
Go 语言结构体
开发语言