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