对于一个典型的Qt应用程序,我们用到如下工具:
- QML: 一种声明式、灵活、动态类型的解释型语言,专门用于定义反应式且美观的GUI布局和部件,具有快速的迭代速度。
- C++ :Qt的传统后端 ,特点是生态系统丰富,但开发速度慢且易错。
显然,rust语言替代C++的后端位置,是一个不错的选择。
然而,C++和QML在Qt应用程序中仍然占有一席之地。因此,Rust、C++和QML应该能够相互补充。CXX-Qt旨在通过使用Qt的元对象系统和CXX,使这三种语言能够轻松地集成在一起。
由于CXX-Qt主要是CXX的扩展,你应该首先熟悉CXX。
CXX已经提供了Rust与C++之间的惯用交互。CXX-Qt在此基础上构建,允许你在Rust中定义Qt特定的概念。
这些概念包括:
自定义QObject类
属性
可调用/槽
信号
继承和重写
枚举(QEnum)
命名空间(QNamespace)
与CXX一样,要使用这些功能,你需要用一个属性宏(#[cxx_qt::bridge])标记一个Rust模块。在这个桥接模块中,你可以描述C++/Qt代码到Rust,或者Rust代码到C++/Qt的接口。
接口是两个独立的部分:
- C++文件,定义QObjects、枚举等,并将它们暴露给Qt的元对象系统。
- Rust代码,提供所描述结构的Rust实现,以及你声明的任何C++/Qt构造的接口。
CXX-Qt模块生成概述
将Rust结构体作为QObjects
与CXX类似,CXX-Qt允许你将Rust结构体作为一种新类型暴露给C++。然而,CXX-Qt扩展了这一功能,允许你创建一个由Rust结构体支持的QObject子类。与普通的不透明CXX类相比,QObject子类和Rust结构体之间的映射不是1:1的!
QObject子类在Rust和C++中都是它自己的类型。当这样的QObject被实例化时,它总是会构造一个Rust结构体的实例。然后,QObject可以引用底层的Rust结构体进行属性访问。这个QObject子类的任何行为也将在Rust中定义,例如使用#[qinvokable]属性。Rust实现还可以访问底层的Rust结构体以修改任何Rust数据。与大多数CXX类型相比,外部的QObject类和内部的Rust结构体将保持两种不同的类型!
下一篇文章,我们将编写第一个CXX-Qt模块。