1. 环境准备与项目结构初探
想给QGroundControl(QGC)地面站加个自己的功能按钮,然后点一下还能弹出一个带点酷炫效果的交互界面?这事儿听起来挺酷,但如果你是第一次打开QGC那庞大的Qt Creator工程,估计会和我当初一样,有点懵。别慌,今天我就带你从零开始,手把手走一遍这个流程。咱们的目标很明确:在QGC 4.0.0版本的主工具栏上,塞进去一个属于我们自己的按钮,点击后能弹出一个自定义的交互面板,里面包含能互相通信、有动画效果的组件。整个过程,我们会大量使用QML,这是Qt Quick的声明式语言,也是QGC界面开发的核心。
首先,你得把开发环境搭起来。去QGC的GitHub仓库,把4.0.0版本的源码克隆下来。我建议直接用git clone命令,然后切换到Stable_V4.0这个tag,确保咱们的代码基础一致。编译环境推荐使用Qt 5.15.2,这是QGC 4.0官方兼容的版本。用Qt Creator打开项目根目录下的.pro文件,静静等待索引完成。第一次编译可能会花点时间,喝杯咖啡等着就好。编译成功后,你能看到原汁原味的QGC地面站界面跑起来,这第一步就算稳了。
接下来,咱们得摸清QGC界面的大致结构。核心的界面逻辑主要集中在src/UI目录下。对于我们要修改的主窗口和工具栏,关键文件是MainRootWindow.qml和MainToolBar.qml。前者定义了整个应用程序窗口的根和主要的视图切换逻辑,你可以把它理解成舞台的总控台;后者则专门负责顶部那一排工具栏按钮的布局和定义,也就是我们准备“动刀”的地方。先别急着改代码,我建议你花点时间,用Qt Creator的搜索功能,在这两个文件里找找类似“analyzeButton”、“planButton”这样的关键词,看看官方自带的按钮是怎么写的。理解别人的代码结构,是我们自己动手前最好的热身。
2. 在主工具栏上“安家落户”:添加自定义按钮
环境熟悉了,咱们就开始干第一件实事:在顶部工具栏上,把我们自己的按钮图标给放上去。这个按钮就是我们新功能的入口。
首先,打开MainToolBar.qml文件。这个文件里堆满了QGCToolBarButton组件,这就是一个个工具栏按钮。我们需要找一个合适的位置插入自己的按钮。比如,我想把新按钮放在“分析”(Analyze)按钮旁边。找到AnalyzeButton的代码块,它大概长这样:
QGCToolBarButton {
id: analyzeButton
icon.source: "/qmlimages/analyze.svg"
onClicked: mainWindow.showAnalyzeView()
}
看懂了吗?很简单,id是这个按钮的唯一标识,icon.source指定了按钮图标的SVG文件路径,onClicked则定义了点击按钮后要触发的函数。我们就照着这个葫芦画瓢。在你选定的位置(比如analyzeButton后面),插入我们自己的按钮代码:
QGCToolBarButton {
id: myCustomButton
icon.source: "/qmlimages/my-custom-icon.svg"
onClicked: mainWindow.showMyCustomView()
tooltip: qsTr("我的自定义功能") // 添加悬停提示,用户体验更好
}
这里有几个细节要注意。第一,icon.source的路径,你需要准备一个自己的SVG图标文件,放到qmlimages目录下。图标设计尽量简洁,符合QGC的整体风格。第二,onClicked里的mainWindow.showMyCustomView(),这个showMyCustomView函数现在还不存在,是我们接下来要在MainRootWindow.qml里定义的。所以现在点击按钮会报错,别担心,这是正常的开发步骤。
按钮放上去之后,你可能发现图标颜色不对或者大小不合适。QGCToolBarButton本身有一些属性可以调整,比如可以通过icon.color来覆盖默认的图标着色,通过width和height微调大小。但通常,直接使用符合规范的SVG图标,QGC的主题系统会自动处理好样式。这一步完成后,编译运行,你应该就能在工具栏上看到你的新按钮了!虽然点了还没反应,但视觉上已经成功“安家落户”,成就感第一步。
3. 定义视图切换逻辑:连接按钮与界面
按钮有了,但光有个按钮壳子不行,得让它能“召唤”出我们自己的界面。这就需要在应用程序的“大脑”——MainRootWindow.qml里,定义视图切换的规则。
打开MainRootWindow.qml,我们需要做三件事,都是模仿已有的视图(比如分析视图AnalyzeView)来完成的。首先,找到viewSwitch这个函数。它负责根据传入的参数,显示或隐藏不同的主视图。我们在里面添加对我们自定义视图的状态判断:
function viewSwitch(isPlanView) {
...
// 已有的其他视图判断
analyzeWindow.visible = false;
...
// 添加我们自定义视图的显示/隐藏逻辑
myCustomLoader.active = false; // 先假设我们用Loader加载,后面会创建
}
其次,我们需要创建一个类似showAnalyzeView()的函数,当我们的按钮被点击时,这个函数会被调用,用来显示我们的界面。在文件里找到



被折叠的 条评论
为什么被折叠?



