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

相关推荐
Mr.Q7 小时前
Qt多边形填充/不填充绘制
qt
可峰科技7 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
7年老菜鸡9 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
huanggang98213 小时前
在Ubuntu22.04上使用Qt Creator开发ROS2项目
qt·ros2
老秦包你会13 小时前
Qt第三课 ----------容器类控件
开发语言·qt
spygg15 小时前
Qt低版本多网卡组播bug
qt·组播·多网卡组播·qt5.7.0
码农客栈15 小时前
qt QWebSocketServer详解
qt
plmm烟酒僧16 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Black_Friend17 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
CSUC17 小时前
【Qt】QTreeView 和 QStandardItemModel的关系
qt