当前位置: 首页 > news >正文

QtPromise第三方库的介绍和使用

一、介绍

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)。

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

⚙️ 关键差异对比

维度QPromiseQtPromise
所属方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的图片:

http://www.dtcms.com/a/316999.html

相关文章:

  • STM32学习笔记2-GPIO的输出模式
  • 宠智灵宠物AI大模型聚焦医疗核心场景,提升临床决策能力
  • Bilateral Reference for High-Resolution Dichotomous Image Segmentation
  • mmsegmentation·数据结构
  • 《零基础入门AI:传统机器学习进阶(从拟合概念到K-Means算法)》
  • 力扣刷题日常(15-16)
  • 深信服GO面试题及参考答案(下)
  • MCP与Function Calling
  • 三极管基本放大电路静态及动态参数计算
  • 【C++】类和对象2
  • nfs(网络文件系统)+autofs(自动挂载服务)
  • 创维智能融合终端DT741_移动版_S905L3芯片_安卓9_线刷固件包
  • I6328A 蓝牙模块 做 串口透传 操作记录
  • pipeline方法关系抽取--课堂笔记
  • 海信IP810N/海信IP811N_海思MV320-安卓9.0主板-TTL烧录包-可救砖
  • 检索召回率优化探究四:基于LangChain0.3集成Milvu2.5向量数据库构建的智能问答系统
  • 【基础】第八篇 Java 位运算符详解:从基础到实战应用
  • 数据结构:双向链表、循环链表、内核链表
  • 【文本左右对齐】
  • 落霞归雁:从自然之道到“存内计算”——用算法思维在芯片里开一条“数据高速航道”
  • SpringCloud学习-------Feign详解
  • 面试题:前端权限设计
  • 【Spring Cloud】-- 注册中心
  • 广东省省考备考(第六十七天8.5)——资料分析、数量(强化训练)
  • Python 循环语法详解
  • Pandas数据分析完全指南:从入门到实战应用
  • vi编辑器makefile的使用以及双向链表
  • Sklearn 机器学习 数据聚类 层次聚类的两个重要属性
  • c# 在 23:00 - 23:59 之间执行一次的写法
  • 【重要区分】2类模型的时间平均车速与区间平均车速