目录
1、QGC 地面站的显示机制
QGC 显示入口是 MainWindow Widget,加载了 MainWindowHybrid.qml,开始了整个 qml 文件调用系统, 再 MainWindowHybrid.qml 通过 Loader 器加载了 MainWindowInner.qml 在该文件系统中,该文件中完成了主页面的布局。 MainWindowInner.qml 中 MainToolBar 控件位于页面的顶部, 包含了5 大主页面的切换按钮,当鼠标点击时,对 onClicked 事件处理,通过Loader 来加载相应的 qml 文件,页面和 qml 文件的对应关系参看下图:QGC 地面站显示逻辑
QGC 将 QGroundControlQmlGlobal 类构造为单例,在 qml 声明 importQGroundControl 1.0 来引入相关的内容,之后通过 QGroundControl 来访问相应的属性和方法。
为方便大家的使用,在此我给大家介绍一下 Qt 中 C++属性和方法的定义方式。对于 C++中自定义的类如果想要在 qml 中被访问需要满足下面的条件:1. C++类继承自 QObject 或者 Qobject 的父类 2. 添加 Q_OBJECT 字段
1.1、C++类注册为 qml 可访问类型
我们可以通过下面的两种方式将 C++的类声明为 qml 中可以访问的类型:
1. qmlRegisterUncreatableType 声明的类型可以被 qml 通过属性方式访问,却无法qml 中直接构造。 使用示例如下:
qmlRegisterUncreatableType<MultiVehicleManager>("QGroundControl .MultiVehicleManager", 1, 0, "MultiVehicleManager", "Reference only"); |
QGroundControlQmlGlobal.h 中将 MultiVehicleManager 通过下面的语句 声明为它的属性: Q_PROPERTY(MultiVehicleManager* multiVehicleManager READ multiVehicleManager CONSTANT) |
Qml 中课题通过 QGroundControl.multiVehicleManager 来访问其中的属 性和方法 |
2. qmlRegisterType 声明的 C++类型可以在 qml 文件中直接构造,在 qml 中通过 id来访问属性和方法。
qmlRegisterType<PlanMasterController> ("QGroundControl.Controllers", 1, 0, "PlanMasterController"); |
PlanView.qml 中: PlanMasterController { id: masterController ……} |
1.2、注册属性或者方法
通过上面的方式我们将一个 C++类注册入 Qt 的元对象系统中 ,在 C++类中我们可以通过Q_PROPERTY 注册属性,同时可以通过在函数声明前添加Q_INVOKABLE 来声明 qml 可以调用的方法。
1.1.1、 属性声明
主要存在以下几种形式(示例取自 Vehicle 类,大家在实践过程中可以参考其中的实现进行):
1. Q_PROPERTY(int id READ idCONSTANT)当该属性的值一旦被赋值,在整个程序运行期间,在我们的 C++承租中不会修改该参数值时,我们采用这样的表达式。
2. Q_PROPERTY(QGeoCoordinate coordinate READ coordinate NOTIFY coordinateChanged)
当该属性只会在 C++中改变该属性的值的时候,我们会采用这样的表达式,当我们在 C++中改变该参数值时,发射 coordinateChanged 信号, 来通知 qml 相关的属性有更改 i 进