QGC PlanView(任务规划功能) 界面加载顺序

本文详细介绍了QGroundControl的任务规划界面布局与功能实现,包括地图、工具栏、任务选择区及地图比例尺等UI元素,并深入解析了航点上传的具体流程和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一,文件位置: qgroundcontrol.qrc->qml->PlanView.qml

二,任务规划 UI

QGCViewPanel{

       FlightMap{//1,地图

        ToolStrip{//2,左侧 竖条状工具栏 Waypoint  Sync Center In Out

        title: qsTr("Plan")

                      }            

       }     

Item{  //3,右侧 Mission(任务) Fence(地理围栏)Rally(集结点) 选择区域

      anchors.fill:  rightPanel

     //PlanElementselector(Mission/Fence/Rally)

     Row{

       id:planElementSelectorRow

 

       QGCRadioButton{

                     text:qsTr("Mission")

           }

    QGCRadioButton{

          id:planElementGeoFence

                   text:qsTr("Fence")                  

          }

       }

}

MapScale{//4,左下角 地图比例尺

           id:                mapScale      

 }

MissionItemStatus{//5,底部 任务状态

           id:                waypointValuesDispla

       }      

Component{//Sync组件,位于左侧条状工具栏之中。用于 上传任务、下载任务、读文件、写文件、删除所有任务。

        id:syncDropPanel

   

    QGCButton{

            text:qsTr("Upload")

}

    QGCButton{

            text:qsTr("Download")

}

三,上传航点过程

1,点击 Waypoint

ToolStrip-》onClicked:{                                

                    switch(index){

                    case0:

                        _addWaypointOnClick=checked

2,在地图上添加航点  MouseArea

varcoordinate=editorMap.toCoordinate(Qt.point(mouse.x,mouse.y),false/*clipToViewPort*/)//鼠标当前点 转为十进制 经纬高

                    coordinate.latitude=coordinate.latitude.toFixed(_decimalPlaces)

                    coordinate.longitude=coordinate.longitude.toFixed(_decimalPlaces)

                    coordinate.altitude=coordinate.altitude.toFixed(_decimalPlaces)

                        }

 

functioninsertSimpleMissionItem(coordinate,index){

       varsequenceNumber=_missionController.insertSimpleMissionItem(coordinate,index)

       setCurrentItem(sequenceNumber,true)

}

 2.1 文件位置:MissionManager->MissionController.h

 intMissionController::insertSimpleMissionItem(QGeoCoordinatecoordinate,inti)

{

    intsequenceNumber=_nextSequenceNumber();

    SimpleMissionItem*newItem=newSimpleMissionItem(_controllerVehicle,this);

    newItem->setSequenceNumber(sequenceNumber);

    newItem->setCoordinate(coordinate);

    newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT);

    _initVisualItem(newItem);

    if(_visualItems->count()==1){

       newItem->setCommand(_controllerVehicle->vtol()?MavlinkQmlSingleton::MAV_CMD_NAV_VTOL_TAKEOFF:MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF);

    }

    newItem->setDefaultsForCommand();

    if((MAV_CMD)newItem->command()==MAV_CMD_NAV_WAYPOINT){

       double     prevAltitude;

       MAV_FRAME  prevFrame;

 

       if(_findPreviousAltitude(i,&prevAltitude,&prevFrame)){

           newItem->missionItem().setFrame(prevFrame);

            newItem->missionItem().setParam7(prevAltitude);

       }

    }

    _visualItems->insert(i,newItem);

    _recalcAll();

    returnnewItem->sequenceNumber();

3,上传 Upload
PlanView.qml sendToVehicle()->MissionController.h sendToVehicle()
->sendItemsToVehicle(_managerVehicle,_visualItems) 
-> vehicle missionManager()->writeMissionItems(rgMissionItems)
->MissionManager.cc_writeMissionItemsWorker-> _writeMissionCount() 
 mavlink 写入总个数,并发送回应请求_startAckTimeout(AckMissionRequest);
->_handleMissionRequest( )  mavlink收到请求,开始通过 航点序号发送航点

 

4,总结:先发送总个数,收到回复后,开始发送航点。按照 回复-》发送->回复-》发送的方式。

5,航点上传顺序参考:https://wenku.baidu.com/view/76e79317b7360b4c2e3f641f.html

6,中心 地图 网片切割:https://www.jianshu.com/p/31a538c9cfc9?from=timeline&isappinstalled=0

### 实现点击按钮后打开新界面功能 在 Qt Ground Control (QGC) 或其他基于 Qt 的应用程序中,要实现点击按钮后打开新界面功能,通常涉及以下几个方面: #### 创建新的窗口类 首先定义一个新的窗口类来表示即将显示的新界面。假设这个新界面是一个简单的对话框。 ```cpp // NewDialog.h #ifndef NEWDIALOG_H #define NEWDIALOG_H #include <QDialog> class NewDialog : public QDialog { Q_OBJECT public: explicit NewDialog(QWidget *parent = nullptr); }; #endif // NEWDIALOG_H ``` ```cpp // NewDialog.cpp #include "NewDialog.h" NewDialog::NewDialog(QWidget *parent) : QDialog(parent){ setWindowTitle(tr("New Interface")); } ``` #### 连接按钮信号到槽函数 接着,在主界面上创建一个按钮,并连接其 `clicked` 信号至处理该事件的槽函数。 ```cpp // MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "newdialog.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); private slots: void on_openButton_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H ``` ```cpp // MainWindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::on_openButton_clicked); } void MainWindow::on_openButton_clicked(){ NewDialog dialog(this); dialog.exec(); // 显示模态对话框 } ``` 上述代码展示了如何通过 C++ 和 Qt 框架构建基本的应用程序结构[^1]。当用户点击名为 `openButton` 的按钮时,会触发 `on_openButton_clicked()` 方法,进而实例化并展示 `NewDialog` 对象作为新的界面。 对于更复杂的交互逻辑或插件开发,则可以考虑利用类似 Plugins 浏览器这样的工具辅助开发过程[^2];而对于特定组件的状态管理(如激活/停用),则可能涉及到蓝图系统的集成工作[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值