
Qt 框架性开发实践
文章平均质量分 77
通过搭建基础框架、开发功能组件的一些例子,介绍使用 Qt 进行桌面应用开发的一些要点和可行性实践。(代码开源)
Fighting Horse
专注移动端、桌面端跨平台程序架构;深入网络、音视频、3D渲染等技术应用。
展开
-
Qt 框架性开发实践(序言)
最近我会将使用 Qt 开发的一些经验在这里分享出来,供大家讨论。最近两三年,我们用 Qt 开发了一个在学校课堂授课的工具箱应用,其中不少经验对于借助 Qt 参与到桌面开发的人,或许有些帮助。不管你是刚刚接触到 Qt,还是已经用过一段时间,但是还想更好的使用 Qt 来完成自己的工作,我想都可以参与到这个讨论中来。 为了显得有些与众不同,我不准备采用知识点罗列的形式来讲解Qt 的使用,而是以具体的任务为主线,看看如何用 Qt 实现一些功能。这些功能有些应该...原创 2021-10-09 09:24:57 · 392 阅读 · 0 评论 -
Qt 框架性开发实践——基础框架篇
基于 Qt 的组件合成框架基于 Qt 的 Promise 异步框架基于 Qt 的消息总线基于 Qt 的 REST 网络框架原创 2021-10-11 19:40:24 · 770 阅读 · 0 评论 -
【第一篇】基于 Qt 的组件合成框架
本文是 《Qt 框架性开发实践——基础框架篇》的第一篇。 本文所讲的内容已经开源,你可以在这个Github 地址找到源代码。 组件合成是一种比较先进的组件化开发模式。通过它,可以实现工厂模式,策略模式,单列模式,代理模式。在 Java 中,它是 Spring boot 的 @Autowird,在 C# 中,它是 MEF 的 @Export、@Import。组件合成在本质上是利用语言的反射、注解机制,通过将组件的发布与引用解耦,使用...原创 2021-10-10 13:07:19 · 2028 阅读 · 0 评论 -
1.1 组件合成与 Qt 元数据
Managed Extensibility Framework (MEF) 托管扩展框架或MEF是用于创建轻量级和可扩展应用程序的库。它使应用程序开发人员无需配置即可发现和使用扩展。它还使扩展开发人员可以轻松地封装代码并避免脆弱的硬依赖性。MEF不仅允许扩展在应用程序内重用,而且还可以跨应用程序重用。我们将MEF迁移到Qt中,帮助我们在Qt应用开发中提升效率。模型概述MEF的主要模型包括下列元素,我们在迁移中将基础常用的部分进行了对比实现,舍弃了不常用或者难以在C...原创 2021-10-10 13:05:24 · 1034 阅读 · 0 评论 -
1.2 组件合成与插件化(Qt)
组件合成与插件化(Qt)原创 2021-10-14 22:19:42 · 1321 阅读 · 2 评论 -
【第二篇】 基于 Qt 实现消息总线
本文是 《Qt 框架性开发实践——基础框架篇》的第三篇。 本文所讲的内容已经开源,你可以在这个Github 地址找到源代码。原创 2021-10-15 08:52:07 · 2770 阅读 · 5 评论 -
2.1 用 Qt 信号-槽实现消息分发
针对消息,主要有订阅、取消订阅、发布 3 种操作。基于 Qt 的信号-槽来实现,是很简单的。class QTEVENTBUS_EXPORT QMessageBase : public QObject{ Q_OBJECTsignals: void on_message(QMessageResultPointer data);}; 我们的消息维护对象(每种消息都有一个对应的消息维护对象)上,有一个信号(on_message)。发布消息的时候,会触发该...原创 2021-10-15 12:12:41 · 1433 阅读 · 2 评论 -
2.2 消息总线中的弱类型处理(QVariant)
弱类型能够帮助我们进一步减少组件之间通信的耦合性,特别在编译链接阶段,我们并不需要包含(include)定义消息的头文件,也不需要链接(link)实现消息的链接库。 在有些场景下,弱类型是必须的。比如在浏览器 js 中对接消息总线,就不可能包含头文件。弱类型消息 对于弱类型消息,除了消息类型是 QVariant 外,基本的订阅、发布实现与强类型消息是一样的,都是基于 Qt 的信号-槽机制。强类型消息通过消息的类型来关联发布和订阅,弱...原创 2021-10-15 21:23:59 · 876 阅读 · 0 评论 -
2.3 对消息的反馈与异步收集
在消息总线中,我们使用 QtPromise 来实现异步的处理。选择 Promise 是因为它简单有效,先说一下 Promise 的基本规范。Promise 规范Promise 是一个拥有 then 方法的对象 Promise 的状态•等待态(Pending)•处于等待态时,promise 需满足以下条件:•可以迁移至执行态或拒绝态•执行态(Fulfilled)【实现态】•处于执行态时,promise 需满足以下条件:•不能迁移至...原创 2021-10-16 10:49:07 · 1044 阅读 · 0 评论 -
【第三篇】 基于 Qt 的 REST 网络框架
在 Java 以及其他语言中,处理与后端的 HTTP 通讯,有专门的工具库,使用起来特别方便。比如使用 Java 中的 Retrifit/OkHttp,只需要声明一下服务 API 接口,就可以基于它与后端通信了。而且 OkHttp 提供了拦截器模式,可以支持自定义策略模式。这些功能能不能在 Qt/C++ 里面实现呢?public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo&g...原创 2021-10-16 14:44:29 · 2218 阅读 · 3 评论 -
3.1 基础 HTTP 请求、应答处理(Qt)
在 Qt 中,使用 QNetworkAccessManager 访问网络。基本的操作主要有:配置QNetworkAccessManager 封装请求 提交请求(附带可选的 Body) 处理应答配置QNetworkAccessManager 需要配置的有:代理、重定向策略。其中配置代理要麻烦一点,实现如下:void QRestClient::setProxyUrl(const QByteArray &url){ QUrl proxyU...原创 2021-10-16 16:04:59 · 1221 阅读 · 0 评论 -
3.2 实现 Qt Rest 网络拦截器
Rest 网络拦截器 本文介绍 Qt Rest 网络框架中的拦截器,其基本接口定义如下:class QTRESTCLIENT_EXPORT QRestInterceptor : public QObject{ Q_OBJECTpublic: virtual void attached(QRestClient * client); virtual void detached(QRestClient * client); virtual QtPromi...原创 2021-10-16 19:57:12 · 573 阅读 · 0 评论 -
3.3 Qt Rest 网络数据序列化
Q 在处理 Qt 数据序列化时,QJsonSerializer 是一个很好的工具。QJsonSerializer 支持所有基本类型、数组链表、QObject 属性以及 Q_GARGET 属性。 但是用 QJsonSerializer 完成序列化的工作,可能会遇到一些不容易定位解决的问题。所以有必要了解其设计原理以及部分实现细节。这样遇到问题才能定位分析,解决。QJsonSerializer 设计思路 转换器完成 QVariant 与 QJsonValue...原创 2021-10-17 18:10:56 · 752 阅读 · 1 评论 -
3.4 C++ Rest 服务 API 自动实现
使用过 Java Retrifit 的人,一定对它的简单易用感到惊叹。它的“声明即实现”的思想,让所有人都觉得耳目一新。public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user);}如何在 C++ 中也做到这样的效果呢?本文正是提供了一个实现思路。 ...原创 2021-10-17 19:13:14 · 1847 阅读 · 0 评论 -
【第四篇】用 Qt 实现电子白板
本文是 《Qt 开发演练系列——实战篇》的第一篇。 本文所讲的内容已经开源,你可以在这个Github 地址找到源代码。在本篇中,我们要实现一种类似 PPT 的演示工具——电子白板,与 PPT 一样,电子白板也可以按页面组织演示的内容,在演示中切换页面。但是,电子白板相对更灵活一些,没有固定的演示流程,你可以在演示中任意跳转到某个页面,也可以随意拖动,或者临时添加、删除、编辑白板里的某些内容。我们先看一下白板页面的展示效果。...原创 2021-10-09 08:40:48 · 3496 阅读 · 10 评论 -
4.1 Qt 中的网络文件下载
在电子白板的系统层,我们用 Qt 实现重点是从网络上下载文件,具体的任务有:用 QNetworkManager 下载网络文件 实现一个特殊的 QIODevice 管理数据流网络处理从网络下载文件会面临许多的问题:网络暂时不通、TCP连接卡顿、连接断开,用户会等待焦虑,被失败搞得焦头烂额。 所以文件下载需要支持卡顿检测、进度汇报,断点续传,更进一步的需要有取消下载,优先下载(次要任务规避)等功能。 为什么要管理数据流呢?QNetw...原创 2021-10-09 08:57:21 · 2249 阅读 · 0 评论 -
4.2 Qt 中的界面数据绑定
本文是《用 Qt 实现电子白板》的其中一节,建议全章阅读。 在电子白板中,一个页面(ResourcePage)包含多个资源(比如图片、文字、视频等),资源有先后顺序,决定其对于控件的展示层级关系。 我们希望对资源的管理是数据驱动的,业务层只能操作数据,也就是只能调用ResourcePage 的方法,至于控件的创建、销毁、层级改变都是内部自动管理的。 在 Qt 中,实现数据驱动界面,有一个工具,即 QAbstractItemModel...原创 2021-10-19 19:37:51 · 3377 阅读 · 0 评论 -
4.3 Qt Graphics 场景中的交互逻辑
本文是《用 Qt 实现电子白板》的其中一节,建议全章阅读。 在电子白板中,针对控件的选择、位置编辑操作是最基本的交互逻辑。所谓位置编辑操作,是对控件进行平移、缩放、旋转,所依赖的设备主要有鼠标、触摸,以及部分键盘按键。 QGraphicsItem 提供了一些的选择、编辑的功能,比如 ItemIsSelectable、ItemIsMovable,但是不能完全满足我们的需求,所以需要我们自己实现所有功能。控件选择 给定一个点,这个点命中哪...原创 2021-10-26 15:23:26 · 973 阅读 · 0 评论 -
4.4 Qt Graphics 场景中的二维空间变换
本文是《用 Qt 实现电子白板》的其中一节,建议全章阅读。场景中的二维空间变换是针对控件的平移、缩放、旋转变换。 在上一级我们介绍过场景中的交互逻辑,其中一大块就是操作空间变换,那些是空间变换的输入。另外,我们在《场景视图中二维空间变换矩阵的计算》中介绍了变换矩阵的计算方法。本文的重点在于对二维变换的管理。二维空间变换API 在 QtGraphics 中,二维变换相关的 api 有(QGraphicsItem):void set...原创 2021-10-28 20:20:14 · 732 阅读 · 0 评论 -
4.5 Qt Graphics 中的 UI 绘制
本文是《用 Qt 实现电子白板》的其中一节,建议全章阅读。这里我们介绍几个Graphics 基本的几个绘制 Item 的使用方法,以及一些与 UI 绘制相关的特殊功能。基本绘制 Item图片绘制路径绘制文字绘制SVG 绘制特殊功能 与绘制相关的功能。描述图标位图保存SVG保存...原创 2021-10-29 18:38:06 · 689 阅读 · 0 评论