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中航点或指令的常用信息)

猜你喜欢

转载自blog.csdn.net/qq_16504163/article/details/107355268