1. QGC中UI的启动,从main.cc起 :
//src\main.cc:427
int main(int argc, char *argv[]) {
...
app->_initForNormalAppBoot())
...
}
2. 初始化应用程序 _initForNormalAppBoot
//src\QGCApplication.cc:550
bool QGCApplication::_initForNormalAppBoot() {
...
_qmlAppEngine = toolbox()->corePlugin()->createRootWindow(this);
}
3. 创建根目录 createRootWindow
//src\api\QGCCorePlugin.cc:479
QQmlApplicationEngine* QGCCorePlugin::createRootWindow(QObject *parent)
{
QQmlApplicationEngine* pEngine = new QQmlApplicationEngine(parent);
//QQmlEngine中方法: 添加qml文件目录
pEngine->addImportPath("qrc:/qml");
//注册了一个名为“joystickManager”的 QML上下文的全局可见属性, 能在QML中调用(QML调用C++的一种形式)
pEngine->rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager());
//注册了一个名为“debugMessageModel”的 QML上下文的全局可见属性, 能在QML中调用(QML调用C++的一种形式)
pEngine->rootContext()->setContextProperty("debugMessageModel", AppMessages::getModel());
//加载url的QML根文件,立即创建了由本地文件urls定义的对象树。此为UI显示的根目录
pEngine->load(QUrl(QStringLiteral("qrc:/qml/MainRootWindow.qml")));
return pEngine;
}
这个类结合了QQmlEngine 和 QQmlComponent来提供一种加载单独的QML文件的方法。它还向QML提供了应用程序功能,这些功能通常由c++ /QML混合应用程序控制。官方实例如下:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine("main.qml");
return app.exec();
}
需要我们自建一个根窗口的qml,其中一般需包含Window或ApplicationWindow。
在上述“createRootWindow”的 第七行中: pEngine->addImportPath(“qrc:/qml”); 此处是添加qmldir的目录路径,qgroundControl.qrc 中的如下:
4. ApplicationWindow 中根目录的启动到五大界面的加载
//src\ui\MainRootWindow.qml:40
ApplicationWindow {
id: mainWindow
//飞行视图
function showFlyView() {
...
//规划视图
function showPlanView() {
...
//分析视图
function showAnalyzeView() {
...
//飞行设置视图
function showSetupView() {
...
//应用设置
function showSettingsView() {
...
}
QGC 会保存上一次的长宽比 ,并默认进入的showFlyView,用户可以通过菜单栏下方的五个按钮实现不同页面的切换, MainToolBar.qml 实现了五大按钮的横向布局,并监听鼠标的点击 onClicked 事件,发射出相应的信号,在MainWindowInner.qml 中对相应的信号处理,加载不同的页面。之后再单独分析QML的根文件。