QGC源码分析——工具栏MainToolBar流程分析

QGC工具栏中MainToolBar的调用流程分析,如下:
在这里插入图片描述
1. UI 根文件中加载 _mainToolbar

在ui根文件 ApplicationWindow 中,加载了 MainToolBar.qml;当在规划界面的时候,工具栏会被替换成 PlanToolBar.qml,如下:

//MainRootWindow.qml
ApplicationWindow {
	...
	readonly property string    _mainToolbar:               QGroundControl.corePlugin.options.mainToolbarUrl
    readonly property string    _planToolbar:               QGroundControl.corePlugin.options.planToolbarUrl
	     
    ...
	header: ToolBar {
		...
        Loader {
             id:             toolbar
             source:         _mainToolbar ///--[Mark]
    		 ...
}

2. mainToolbarUrl 的定义:

//src\api\QGCOptions.cc:33
QUrl QGCOptions::mainToolbarUrl() const
{
    return QUrl(QStringLiteral("qrc:/toolbar/MainToolBar.qml"));
}

3. MainToolBar 中:
// 五大界面的切换,加其它工具栏显示。

//MainToolBar.qml
//五大视图的切换				
RowLayout {
    id:                 buttonRow
    QGCToolBarButton {
        id:                 settingsButton
		...
        icon.source:        "/res/QGCLogoWhite"
        onClicked: {
            mainWindow.showSettingsView() ///--[Mark]
            ...
    }
    QGCToolBarButton {
        id:                 setupButton
        ...
        icon.source:        "/qmlimages/Gears.svg"
        onClicked: {
            mainWindow.showSetupView()  ///--[Mark]
            ...
    }
    QGCToolBarButton {
        id:                 planButton
		...
        icon.source:        "/qmlimages/Plan.svg"
        onClicked: {
            mainWindow.showPlanView() ///--[Mark]
            ...
    }
    QGCToolBarButton {
        id:                 flyButton
        Layout.fillHeight:  true
        icon.source:        "/qmlimages/flyview.svg"
        onClicked: {
			mainWindow.showFlyView() ///--[Mark]
			...
		}
}
...
//其他工具栏的加载
Loader {
	id:                 toolbarIndicators
	source:             "/toolbar/MainToolBarIndicators.qml" ///--[Mark]
	...
} //RowLayout

4. 加载 toolBarIndicators 模型:

//MainToolBarIndicators.qml
    Repeater {
        model: activeVehicle ? activeVehicle.toolBarIndicators : [] ///--[Mark]
        Loader {
            ...
            source:             modelData ///--[Mark]
        }
    }

(1) 模型 activeVehicle.toolBarIndicators 的信息如下:

//Vehicle.h
//声明为QML属性的信号槽机制,C++中触发,QML属性也会变化
Q_PROPERTY(QVariantList   toolBarIndicators   READ toolBarIndicators  NOTIFY toolBarIndicatorsChanged)
//Vehicle.cc
//C++中信号槽绑定。  
connect(_firmwarePlugin, &FirmwarePlugin::toolbarIndicatorsChanged, this, &Vehicle::toolBarIndicatorsChanged)

(2) 基类 FirmwarePlugin ,toolBarIndicators 被定义为虚函数,可以被子类APM中修改

它声明如下:

//FirmwarePlugin.h
virtual const QVariantList& toolBarIndicators(const Vehicle* vehicle);

定义如下:

const QVariantList &FirmwarePlugin::toolBarIndicators(const Vehicle*)
{
	if(_toolBarIndicatorList.size() == 0) {
	_toolBarIndicatorList = QVariantList({
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/MessageIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/TelemetryRSSIIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RCRSSIIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/BatteryIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSRTKIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/ROIIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/ArmedIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/ModeIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/VTOLModeIndicator.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/MultiVehicleSelector.qml")),
	    QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/LinkIndicator.qml")),
	});
	...
}

(3) 子类APM中继承关系:

//子类: 父类
class ArduSubFirmwarePlugin : public APMFirmwarePlugin {...}
//子类: 父类
class APMFirmwarePlugin : public FirmwarePlugin {...}

在子类AMP中定义:

//ArduSubFirmwarePlugin.cc
const QVariantList& ArduSubFirmwarePlugin::toolBarIndicators(const Vehicle* vehicle)
{
    ...
    if(_toolBarIndicators.size() == 0) {
        _toolBarIndicators = QVariantList({
            QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/MessageIndicator.qml")),
            QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/BatteryIndicator.qml")),
            ...
}

每一个QML在 MainToolBarIndicators.qml 的Repeater 中遍历加载。


● 系列文章目录

QGC源码分析——UI界面的启动流程(从mian.cc到五大视图)

QGC源码分析——航向规划中航点编辑流程(QGroundControl)

QGC源码分析——MavCmdInfoCommon.json加载的流程分析(保存了mavlink中航点或指令的常用信息)

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值