扩展 Qt IVI
简介
Qt IVI 为通过适用于汽车用例的特定方式扩展 Qt 提供了模式。
一个关键方面是把定义 API 的前端和实施功能的后端分离开来。这种分离使得可以有多种 API 的实现,可以用于与各种硬件配置进行接口,但也可以为了早期开发和服务提供模拟实现。
总体视角
Qt IVI 由三种类型的构建块组成。核心模块为所有更具体的模块提供基础类和常见代码,例如气候 API 或媒体播放器 API。其中每个 API 都是第二个构建块,称为 特性,它定义了应用程序开发人员使用的 API。最后的块包含一个后端接口和一个或多个 后端 来连接到基础车辆或对其进行模拟。
特性
特性是一组用于处理特定功能的类。它定义了面向应用程序开发人员的接口,但不实现完整的功能。相反,它定义了一个要由后端实现的接口来提供实际功能。
为了便于部署,应将 Qt IVI 扩展构建为 Qt 模块。这使得轻松从应用程序项目中安装和查找头文件、共享库和插件模块变得容易。
使用模块系统,开发者可以轻松启用其模块的包含,以下方式:
QT += <module>
此外,您的模块已适当设置以与 cmake、qdoc 和自动测试一起工作。
make tests
在创建新的 Qt IVI 模块时,建议您选择一个如 OemFeatureName 的名称,其中 Oem 是汽车制造商或平台所有者的名称,FeatureName 是模块的特性的名称。除了名称之外,还需要一个逆向域名前缀,用于后端接口名称的前缀,例如 com.example。
特性基于 QIviAbstractFeature 基类,或者基于 QIviAbstractZonedFeature 的分区特性类别。这些类提供了用户预期的基础功能,例如后台加载。
特性定义了后端提供的功能所需实现的后端接口。后端接口通常基于 QObject 类。保持此 API 尽可能无偏见非常重要,因为可能有多个后端实现依赖于不同的技术解决方案。
以下是一些需要记住的关键规则:
- 保持所有内容异步,以避免阻塞主循环。
- 避免调用到信号序列,并尽量保持信号与调用独立,例如,当值发生变化时,不应是由于调用功能来改变值(反之亦然)。换句话说,调用改变值并不总是导致值变化的信号。
- 尽可能避免有状态的API,因为后端可能在任何时刻被替换。
通常为每个功能提供模拟后端实现和测试后端。
后端
后端类是从由功能指定的(通常是QObject衍生的)后端接口类派生而来。后端类的实例称为服务对象。
后端被实现为依赖于Qt IVI Core和相应功能模块的普通Qt C++插件项目。
Qt IVI Core在功能请求时加载后端。每个后端都必须提供一个Qt IVI插件,该插件将一个工厂暴露给核心。这用于加载和创建后端。插件接口称为QIviServiceInterface。
服务管理
在大多数情况下,后端加载由Qt IVI Core处理,然而,在这种情况下可以使用QIviServiceManager手动搜索具有特定BackendInterface的插件。后端的发现和加载发生在此类中。
QIviServiceManager类还可以用于注册同一应用中的应用程序后端,而不应放入插件中。这对于自动测试非常有用,因为它需要同时控制后端和功能。
常用实践
作为Qt IVI一部分提供的参考API引入了一些常见概念。如果在实现相同功能,建议使用这些已定义的样式,并鼓励将API补充回Qt IVI存储库,为未来的API创造更多的共同基础。
©2020 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。提供的文档根据GNU自由文档许可1.3版的条款进行许可,由自由软件基金会发布。Qt及其相关标志是芬兰以及/或其他国家的Qt公司商标。所有其他商标均为各自所有者的财产。