QFuture 使用笔记

1. QFuture详解

概念

QFuture是Qt库中的一个类,它代表了一个异步计算的结果。当你启动一个耗时的操作,如文件读取、网络请求或复杂的计算任务时,你不希望这些操作阻塞主线程,从而影响用户界面的响应性。QFuture就是用来处理这种异步操作的,它允许你在任务完成后获取结果,而不必阻塞主线程。

用途

  • 异步执行任务,避免阻塞UI线程。
  • 监控任务的进度和状态。
  • 获取异步任务的结果。

主要特点

  • QFuture是模板类,可以处理不同类型的结果。
  • 提供了查询任务状态(如是否开始、是否完成、是否取消等)的方法。
  • 可以与QFutureWatcher结合使用,通过信号和槽机制来监控任务的进度和结果。

2. 信号和槽列表在QFuture中的作用和用法

在Qt中,信号和槽是一种对象间通信的机制。当某个特定事件发生时,一个对象可以发射(emit)一个信号,而另一个对象的槽(slot)可以被这个信号触发。

对于QFuture和相关的QFutureWatcher类,这种机制尤为重要,因为它允许你在异步任务的不同阶段执行特定的操作。

主要信号

  • started(): 当异步任务开始时发射。
  • finished(): 当异步任务完成时发射。
  • progressValueChanged(int progress): 当任务进度改变时发射,携带当前进度值。
  • progressRangeChanged(int minimum, int maximum): 当任务的进度范围改变时发射。
  • progressTextChanged(const QString &progressText): 当任务的进度文本改变时发射。

槽的用法

你可以将上述信号连接到任何你定义的槽函数上,以便在任务的不同阶段执行自定义的操作。例如,你可以在任务开始时显示一个加载动画,在任务完成时隐藏加载动画并显示结果。

3. 示例代码

下面是一个简单的示例,展示了如何使用QFuture和信号槽机制来异步执行一个函数,并在任务完成时更新UI。

#include <QtConcurrent>  
#include <QFutureWatcher>  
#include <QObject>  
#include <QDebug>  
  
// 假设我们有一个耗时的函数  
QString longRunningFunction(int n) {  
    QThread::sleep(n); // 模拟耗时操作  
    return QString("Completed after %1 seconds").arg(n);  
}  
  
class MyObject : public QObject {  
    Q_OBJECT  
public:  
    MyObject() {  
        connect(&watcher, &QFutureWatcher<QString>::finished
            , this, &MyObject::handleFinished);  
    }  
  
    void startLongRunningTask(int seconds) {  
        future = QtConcurrent::run(longRunningFunction, seconds);  
        watcher.setFuture(future);  
    }  
  
private slots:  
    void handleFinished() {  
        qDebug() << "Task finished, result:" << watcher.result();  
    }  
  
private:  
    QFuture<QString> future;  
    QFutureWatcher<QString> watcher;  
};  
  
int main() {  
    MyObject obj;  
    obj.startLongRunningTask(5); // 启动一个耗时5秒的任务  
    // ... 其他代码,如事件循环等 ...  
}

在这个示例中,MyObject类使用QFuture和QFutureWatcher来异步执行longRunningFunction函数。当任务完成时,QFutureWatcher会发射finished信号,这个信号被连接到handleFinished槽函数上,从而处理任务的结果。

相关推荐
mahuifa5 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
云空10 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
小老鼠不吃猫11 小时前
力学笃行(二)Qt 示例程序运行
开发语言·qt
晓纪同学12 小时前
QT创建一个模板槽和信号刷新UI
开发语言·qt·ui
爱码小白14 小时前
PyQt5 学习方法之悟道
开发语言·qt·学习方法
人才程序员1 天前
QML z轴(z-order)前后层级
c语言·前端·c++·qt·软件工程·用户界面·界面
学习BigData1 天前
【使用PyQt5和YOLOv11开发电脑屏幕区域的实时分类GUI】——选择检测区域
qt·yolo·分类
yerennuo2 天前
FFmpeg库之ffmpeg
qt·ffmpeg
冷眼看人间恩怨2 天前
【Qt笔记】QComboBox控件详解
c++·笔记·qt