一、介绍

1、核心特性

        QtPromise是遵循Promises/A+规范的第三方库,提供链式异步操作(then/fail/finally),简化事件驱动开发(如网络请求、文件读写)。

2、兼容性要求

        QtPromise基于Qt5.6及以上版本,当然也包括Qt6,C++11及以上

        仅头文件实现:无需编译独立库,直接包含源码即可

3、QtPromise与QPromise对比分析

🧩 本质区别

  1. QPromise

    • 官方组件:隶属于 Qt 核心库(QtCore),随 Qt 6.0 正式引入。

    • 定位:作为 QFuture 的配套工具,用于向 QFuture 传递计算结果、进度和状态通知(如取消/暂停)。

    • 典型场景配合 QtConcurrent::run 或自定义线程,实现细粒度任务控制(如多结果报告、进度更新)。

  2. QtPromise

    • 第三方库:由社区开发,独立于 Qt 官方发行。

    • 定位:遵循 Promises/A+ 规范,提供类 JavaScript 的链式异步编程模型(then/catch/finally)。

    • 典型场景:简化回调嵌套,处理网络请求、文件读写等异步操作链。

⚙️ 关键差异对比

维度 QPromise QtPromise
所属方 Qt 官方 (QtCore) 第三方开源库 (GitHub)
Qt 版本要求 ≥ Qt 6.0 ≥ Qt 5.6
设计目标 作为 QFuture 的数据源,支持进度/取消/多结果 实现 Promises/A+ 规范,支持链式调用
线程安全 ✅ 所有方法线程安全 ❌ 依赖实现,未强制保证
典型用法 显式调用 addResult()finish() then() 链式组合异步操作
错误处理 setException() 设置异常 reject() 触发 → catch() 捕获

二、下载

GitHub下载:
https://github.com/simonbrunel/qtpromise.githttp://QtPromise源码GitHub下载链接:

CSDN下载:

【免费】QtPromise源码资源-CSDN下载https://download.csdn.net/download/csdndenglu/91598295

三、Qt6.5+CMake项目配置与使用

下载解压后目录如下:

        qmake中使用方法很简单:QtPromise源码只有头文件,将源码目录中的qtpromise.pri添加到自己工程的pro文件中即可。如下:

include($$PWD/qtpromise/qtpromise.pri)

        CMake项目中配置示例:在项目目录下新建thirdparty文件夹,将解压后的qtpromise-master改名为qtpromise后放到thirdparty文件夹下,如下图:

        CMakeLists.txt文件中添加:

# 添加QtPromise源码
add_subdirectory(${THIRDPARTY_DIR}/qtpromise)
# 链接依赖
target_link_libraries(${Project_Name} PRIVATE
    qtpromise::qtpromise
)

        测试:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtPromise>
using namespace QtPromise;
#include <QNetworkAccessManager>
#include <QNetworkReply>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QString url = "http://www.baidu.com";
    // 360安全卫士用于测试超时.
    // QString url = "http://dl.360safe.com/setup.exe";
    // 可以断网验证网络错误.
    QtPromise::QPromise<QByteArray>{[&](
                                        const QtPromise::QPromiseResolve<QByteArray>& resolve,
                                        const QtPromise::QPromiseReject<QByteArray>& reject) {
        QNetworkReply* reply = manager->get(QNetworkRequest{url});
        QObject::connect(reply, &QNetworkReply::finished, [=]() {
            if (reply->error() == QNetworkReply::NoError) {
                resolve(reply->readAll());
            } else {
                reject(reply->error());
            }

            reply->deleteLater();
        });
    }}
        .timeout(5000)
        .then([](const QByteArray &data){
            // 如果5秒内下载成功,进行下一步处理.
            qDebug()<<data<<"AAAAA";
        })
        .fail([](QNetworkReply::NetworkError error) {
            // 网络错误.
            qDebug()<<error<<"BBBBB";
        })
        .fail([](const QPromiseTimeoutException& error) {
            // 超时报错.
            qDebug()<<error.what()<<"CCCCC";

        });

}

        注意,为了使用#include <QNetworkAccessManager>和#include <QNetworkReply>,需要在CMakeLists.txt文件中添加:

find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)

测试输出html的图片:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐