QtPromise第三方库的介绍和使用
一、介绍
1、核心特性
QtPromise是遵循Promises/A+规范的第三方库,提供链式异步操作(then
/fail
/finally
),简化事件驱动开发(如网络请求、文件读写)。
2、兼容性要求
QtPromise基于Qt5.6及以上版本,当然也包括Qt6,C++11及以上
仅头文件实现:无需编译独立库,直接包含源码即可
3、QtPromise与QPromise对比分析
🧩 本质区别
-
QPromise
-
官方组件:隶属于 Qt 核心库(
QtCore
),随 Qt 6.0 正式引入。 -
定位:作为
QFuture
的配套工具,用于向QFuture
传递计算结果、进度和状态通知(如取消/暂停)。 -
典型场景:配合
QtConcurrent::run
或自定义线程,实现细粒度任务控制(如多结果报告、进度更新)。
-
-
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} PRIVATEqtpromise::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的图片: