在嵌入式系统中集成 Rust 和 Qt 的实践-设计应用_第1页
在嵌入式系统中集成 Rust 和 Qt 的实践-设计应用_第2页
在嵌入式系统中集成 Rust 和 Qt 的实践-设计应用_第3页
在嵌入式系统中集成 Rust 和 Qt 的实践-设计应用_第4页
在嵌入式系统中集成 Rust 和 Qt 的实践-设计应用_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑在嵌入式系统中集成Rust和Qt的实践-设计应用Rust为嵌入式软件提供高性能、高可靠性和强大的安全性,并帮助开发人员检查并减少复杂、低级应用程序常见的内存和线程错误。凭借这些明显的优势,Rust在嵌入式软件开发人员中越来越受欢迎。同样,作为跨平台嵌入式应用程序的框架之一,Qt为嵌入式领域带来了强大的业务逻辑功能。由于Rust还没有的图形用户界面(GUI),这意味着Rust-Qt集成对嵌入式开发人员越来越感兴趣,并已成为向嵌入式Rust应用程序添加GUI的关键方法之一。将两者整合在一起时,挑战就来了。如果没有仔细的计划和努力,组合的Rust-Qt应用程序就会成为这两种语言弱属性的牺牲品。Qt/C++对Rust的调用可能不安全,域间可能会出现并发问题,Rust的高性能和可移植性可能会打折扣。本文介绍了为嵌入式应用程序实现Rust和Qt世界的推荐原则。Rust和Qt的背景Rust拥有丰富的库生态系统,用于序列化和反序列化、异步操作、解析不安全输入、线程、静态分析等,而Qt是一个C++工具包,支持跨各种平台的丰富的、基于GUI的应用程序,从iOS到嵌入式Linux。Qt应用程序包括表示业务逻辑的C++插件、定义GUI组件和布局的QML以及用于GUI脚本的JavaScript。将Rust库集成到Qt框架中,为开发人员提供了一种强大的机制来提供高性能和安全的基础,从而推动复杂的用户体验。考虑一个农业仪表板应用程序,该应用程序需要安全访问后端I/O微控制器或从基于RTOS的单板计算机提取数据的飞机驾驶舱显示器。一种推荐的应用程序架构是将业务逻辑保留在Rust后端,并为用户界面使用Qt/C++插件。这解耦了两个域,将Qt/QML用于GUI开发的快速迭代速度和灵活性从业务级代码中分离出来。如何为嵌入式软件集成Rust和Qt将Qt与Rust集成的常见方法是让Rust调用Qt的C++库。虽然有几种绑定方法,但这些方法通常不是Rust惯用的,并且往往会失去安全优势,如图1所示。此外,Qt的大多数Rust绑定不会将Rust代码暴露给C++,这使得它们难以集成到现有的C++代码库中。

图1.Rust-Qt绑定的挑战(:KDAB)一种更有效的方法是以安全的方式连接两种语言,尽可能多地保留Rust固有的安全优势。为此,Rust需要能够使用自己的QObject子类和实例以的妥协来扩展Qt对象系统。后一种方法的一个例子是开源库CXX-Qt,它由KDAB发起并管理其正在进行的开发和改进。该库将Qt强大的面向对象和元对象系统与Rust相结合,并基于和扩展了另一个开源Rust/C++互操作性库CXX。在CXX-Qt中,新的QObject子类由Rust模块中的项目组成,以执行桥接功能。这些子类就像QML和C++中的任何其他QObject一样被实例化,将Rust特性暴露给Qt。CXX-Qt定义的每个QObject都包含两个组件:一个基于C++的对象,它是一个公开属性和可调用方法的包装器存储属性、实现可调用对象、管理内部状态并处理来自属性和后台线程的更改请求的Rust结构CXX-Qt自动生成代码以在Rust和Qt/C++域之间传输数据,并使用名为CXX的库在两者之间进行通信。CXX-Qt桥接方法的主要原则为了解释有效的Rust-Qt桥是如何工作的,我们将描述CXX-Qt库背后的几个关键原则。在Rust中声明QObjectQt的设计本质上是面向对象的,对于C++和QML都是如此,而Rust不支持继承和多态性等常见的类特性。为了克服这个限制,CXX-Qt在Rust中扩展了Qt对象系统,以提供一种自然的方式来集成两种语言,同时保持惯用的Rust代码。CXX-Qt桥可以包括以下部分:模块周围的宏指示内容与CXX-Qt相关定义QObject、Qt的任何属性和任何私有状态的结构Qobject结构的可选实现,其中函数可以标记为qinvokable,允许从QML和C++调用它们定义QObject信号的枚举普通CXX块CXX-Qt在代码生成期间将此Rust模块扩展为QObject的C++子类和RustObj结构,如图2所示。图2.CXX-Qt如何扩展QObjects以供运行时使用(:KDAB)下面是一个QObject示例,其中包含三个用于跨域操作的可调用方法和一个Rust-only方法:#[cxx_qt::bridge]modmy_object{不安全的外部“C++”{包括!(“cxx-qt-lib/qstring.h”);输入QString=cxx_qt_lib::QString;包括!(“cxx-qt-lib/qurl.h”);输入QUrl=cxx_qt_lib::QUrl;}#[cxx_qt::qobject]#[推导(默认)]酒吧结构我的对象{#[q属性]is_connected:布尔值,#[q属性]网址:QUrl,}#[cxx_qt::qsignals(MyObject)]酒吧枚举连接{连接的,错误{消息:QString},}实现qobject::MyObject{#[qinvokable]pubfnconnect(mutself:PinmutSelf,url:QUrl){self.as_mut().set_url(url);如果自己.as_ref().url().to_string().starts_with(""){self.as_mut().set_is_connected(true);self.emit(Connection::Connected);}别的{self.as_mut().set_is_connected(false);self.emit(连接::错误{message:QString::from("URL不以"开头),});}}}}使用#[qinvokable]属性声明的方法(例如上面的connect)暴露给QML和C++,参数和返回类型在Qt端匹配。使用#[qproperty]属性(例如上面的is_connected)声明的QObject结构中的字段作为Q_PROPERTY公开给QML和C++。用#[cxx_qt::qsignals(T)]属性标记的枚举定义了在QObjectT上声明的信号。请注意,CXX-Qt会自动在snake_case(Rust)和CamelCase(Qt)命名之间进行转换。在此示例中,connect方法用于从Rust改变QObject的url和connected属性。然后发出一个信号,指示连接是否成功或是否发生错误。没有用属性标记的方法或字段被认为是Rust私有的,可用于管理内部状态或用作线程实例数据。由于QObject是桥的C++端拥有的构造Qt对象,因此它会在运行时销毁C++对象时被销毁。跨桥声明通用数据类型原始数据类型和CXX类型可以跨桥使用,不需要在Rust和Qt之间进行转换。库cxx_qt_lib提供代表常见Qt类型(例如QColor、QString、QVariant等)的Rust类型,以供跨桥使用。随着项目的发展,我们计划在cxx_qt_lib中加入更多常用的Qt类型,比如Qt容器类型(如QHash和QVector)和其他对QtC++或QML有用的类型。然后,我们希望通过向Rust生态系统中已建立的板条箱添加转换来增强这些类型。例如,我们计划支持从QColor到颜色包类型的转换或从QDateTime到日期时间包类型的转换,或者使用Rust包对Qt类型进行(反)序列化等。保持线程安全Rust-Qt应用程序中安全线程背后的一般概念是每当Rust代码执行时在C++端获取一个锁,以防止该代码被多个线程执行。这意味着所有直接从C++调用的Rust代码,例如可调用对象,仅在Qt线程上执行。为了允许开发人员将状态从后台Rust线??程同步到Qt,CXX-Qt提供了一个帮助程序,允许您从后台线程对Rust闭包进行排队。然后从Qt事件循环中执行闭包。//在可调用对象中,请求qt线程的句柄让qt_thread=self.qt_thread();//产生一个Rust线??程std::thread::spawn(移动||{让value=compute_value_on_rust_thread();//使用闭包移动值并在Qt事件循环中运行任务线程.queue(移动|mutqobject|{//发生在Qt事件循环中qobject.set_value(值);}).unwrap();});将RustQObject暴露给QML要在Qt应用程序中使用Rust代码,必须将RustQObject导出到QML。CXX-Qt通过为Rust中定义的每个QObject子类生成一个C++类来简化这个过程——开发人员只需要在main.cpp中包含两个语句:包括QObject类,例如,#include"cxx-qt-gen/my_object.h"将QObject类导出到QML,例如,qml注册类型("com.kdab.cxx_qt.demo",1,0,"MyObject");构建系统CXX-Qt支持使用CMake或Cargo构建。使用CMake,Corrosion(以前称为cmake-cargo)用于将Rustcrate作为静态库导入,然后链接到您的Qt应用程序可执行文件或库。这允许将CXX-Qt轻松集成到现有的CMakeQt应用程序中。构建Rustcrate时,build.rs文件会编译CXX-Qt生成的任何C++代码。对于使用Rust的Cargo构建系统的项目,CXX-Qt也可以在没有CMake的情况下从Cargo使用。使用此方法,Rust项目的build.rs文件还会触发Qt资源的构建、任何其他C++文件的编译以及链接到任何

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论