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槽函数上,从而处理任务的结果。

相关推荐
努力实干4 小时前
Qt/C++ 模块化设计与工程组织
开发语言·c++·qt
Lhan.zzZ5 小时前
Qt:动态库模块框架设计
开发语言·c++·qt
qq_401700411 天前
TCP 长连接、心跳包与断线自动重连设计:工业级通信的“不死鸟”架构
网络·qt·tcp/ip
dyxal2 天前
A2A 协议 v1.0 完全指南:方法名、Agent Card、三种绑定与 FastAPI 实战
开发语言·qt·fastapi
金色熊族2 天前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
前行中的小猪2 天前
Qt 5 踩坑实录:多显示器跨屏拖拽导致窗口异常放大与 setGeometry 报错的深度解析与根治
qt·多显示器·高分辨率·多屏幕
想做小南娘,发现自己是女生喵2 天前
QT项目实战第一周(嵌入式)
开发语言·qt
誰能久伴不乏2 天前
【无标题】
c++·qt·机器人
金色熊族2 天前
在Qt中使用asan检测内存泄漏(二)--检查依赖库的内存使用
linux·qt·asan
qq_401700412 天前
Qt 组播(Multicast)实战详解
开发语言·qt