当前位置: 首页 > 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.lryc.cn/news/611163.html

相关文章:

  • 人工智能领域、图欧科技、IMYAI智能助手2025年1月更新月报
  • ubuntu24中部署k8s 1.30.x-底层用docker
  • 相机拍摄的DNG格式照片日期如何修改?你可以用这款工具修改
  • Android异常信号处理详解
  • 【网络运维】Linux:系统启动原理与配置
  • Coze开源了!意味着什么?
  • 在Linux上部署RabbitMQ、Redis、ElasticSearch
  • 无监督学习聚类方法——K-means 聚类及应用
  • NFS CENTOS系统 安装配置
  • 走进“Mesh无线自组网”:开启智能家居和智慧工厂
  • 安科瑞智慧能源管理系统在啤酒厂5MW分布式光伏防逆流控制实践
  • uv与conda环境冲突,无法使用uv环境,安装包之后出现ModuleNotFoundError: No module named ‘xxx‘等解决方法
  • unity之 贴图很暗怎么办
  • 【STM32】HAL库中的实现(四):RTC (实时时钟)
  • python的教务管理系统
  • 江协科技STM32学习笔记1
  • Spring 的依赖注入DI是什么?
  • 【计算机网络】6应用层
  • PostgreSQL——函数
  • 【语音技术】什么是VAD
  • Windows 电脑远程访问,ZeroTier 实现内网穿透完整指南(含原理讲解)
  • NLP自然语言处理 03 Transformer架构
  • 人工智能-python-Sklearn 数据加载与处理实战
  • ChatGPT以及ChatGPT强化学习步骤
  • MLIR Bufferization
  • Linux驱动学习(八)设备树
  • 《手撕设计模式》系列导学目录
  • 防火墙安全策略练习
  • Dot1x认证原理详解
  • LeetCode 面试经典 150_数组/字符串_H 指数(9_274_C++_中等)(排序后再进行判断)(计数)