#include "mainwindow.h" #include "QPushButton" #include "QAction" #include "QHBoxLayout" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { //setGeometry(); //检测qml文件夹,如果不存在,那么就新建一个,这里存着所有的qml文件 /* QDir *qmlDir = new QDir; if(!qmlDir->exists("./qml")) qmlDir->mkdir("./qml");//如果文件夹不存在就新建 */ setFocusPolicy(Qt::StrongFocus); setAttribute(Qt::WA_AcceptTouchEvents); tts = new QTextToSpeech(this); //ui initial //menubar menuBarUI = new MenuBarUI(this); connect(menuBarUI,SIGNAL(IndexChanged(int)), this,SLOT(onTabIndexChanged(int))); //--------------- //设置 setting = new Setting(this); setting->hide(); //自检 checkUI = new CheckUI(this); checkUI->hide(); //信息 toolsui = new ToolsUI(this); toolsui->hide(); //指令 commandUI = new CommandUI(this); dlink = new DLink(); map = new mapcontrol::OPMapWidget(this); map->SetShowHome(false); map->SetShowCompass(false); map->SetUseOpenGL(true); map->setAttribute(Qt::WA_AlwaysStackOnTop); //QString maptype = myinifile->ReadIni("GCS.ini","Map","Type"); map->SetMapType(mapcontrol::Helper::MapTypeFromString("BingHybrid")); map->setWPLock(true); map->setFocus(); map->setMouseTracking(true); map->setGeometry(0, 0, this->width(), this->height()); qDebug() << "map start"; copk = new Cockpit(this); copk->setGeometry(this->width() - copk->width(),0,340,340); missionUI = new propertyui(this); missionUI->hide(); //this ----- dlink connect(dlink->mavlinknode,SIGNAL(beep()), this,SLOT(beep()),Qt::DirectConnection); //this ----- map connect(map,SIGNAL(TotalDistanceUpdate(double)), this,SLOT(TotalDistance(double))); //tools ----- map connect(dlink->mavlinknode,SIGNAL(recievemsg(mavlink_message_t)), toolsui->index0->mavlinkinspector,SLOT(receiveMessage(mavlink_message_t)),Qt::DirectConnection); //dlink ----- tools connect(toolsui->index2,SIGNAL(setPlay(bool)), dlink->mavlinknode->replay,SLOT(startReplay(bool)),Qt::DirectConnection); connect(toolsui->index2,SIGNAL(setFileName(QString)), dlink->mavlinknode,SLOT(setLogfile(QString)),Qt::DirectConnection); connect(toolsui->index2,SIGNAL(setPercentage(float)), dlink->mavlinknode->replay,SLOT(setPercentage(float)),Qt::DirectConnection); connect(dlink->mavlinknode->replay,SIGNAL(currentPercentage(float)), toolsui->index2,SLOT(setCurrentPercentage(float)),Qt::DirectConnection); connect(dlink->mavlinknode->replay,SIGNAL(replayComplete()), toolsui->index2,SLOT(ReplayComplete()),Qt::DirectConnection); //setting ----- map connect(setting->index0->mapsetting,SIGNAL(getMapTypes()), map,SLOT(getMapTypes())); connect(map,SIGNAL(MapTypes(QStringList)), setting->index0->mapsetting,SLOT(MapTypes(QStringList))); connect(setting->index0->mapsetting,SIGNAL(setMapTypes(QVariant)), map,SLOT(setMapTypes(QVariant))); //command ----- dlink connect(commandUI,SIGNAL(cmd_long(float,float,float,float,float,float,float,uint16_t,uint8_t)), dlink->mavlinknode->Commander,SLOT(WriteCmd_long(float,float,float,float,float,float,float,uint16_t,uint8_t)),Qt::DirectConnection); connect(dlink->mavlinknode->Commander,SIGNAL(commandAccepted(bool,uint16_t,uint8_t)), commandUI,SLOT(commandAccepted(bool,uint16_t,uint8_t)),Qt::DirectConnection); //check ----- dlink connect(checkUI,SIGNAL(cmd_long(float,float,float,float,float,float,float,uint16_t,uint8_t)), dlink->mavlinknode->Commander,SLOT(WriteCmd_long(float,float,float,float,float,float,float,uint16_t,uint8_t)),Qt::DirectConnection); connect(dlink->mavlinknode,SIGNAL(recievemsg(mavlink_message_t)), checkUI,SLOT(RecieveMsg(mavlink_message_t))); connect(dlink->mavlinknode,SIGNAL(addVehicles(int,int)), checkUI,SLOT(addVehicles(int,int))); //setting ----- dlink connect(dlink,SIGNAL(PortConnected(QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant)), setting->index0->link,SIGNAL(PortConnect(QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant))); connect(dlink->mavlinknode,SIGNAL(state_updated()), this,SLOT(updateUI())); connect(setting->index0->link,SIGNAL(connectSignal(QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant)), dlink,SLOT(connectSignal(QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant))); qRegisterMetaType("mavlink_message_t"); connect(dlink->mavlinknode->Parameter,SIGNAL(RecieveValue(mavlink_message_t)), setting->index1->paramInspect,SLOT(appendParameter(mavlink_message_t))); connect(dlink->mavlinknode,SIGNAL(addVehicles(int,int)), setting->index1->paramInspect,SLOT(addVehicles(int,int)),Qt::DirectConnection); connect(setting->index1->paramInspect,SIGNAL(ReadCmd(uint8_t,uint8_t,uint8_t)), dlink->mavlinknode->Parameter,SLOT(ReadCmd(uint8_t,uint8_t,uint8_t)),Qt::DirectConnection); connect(setting->index1->paramInspect,SIGNAL(WriteCmd(uint8_t,uint8_t,const char*,uint8_t,float)), dlink->mavlinknode->Parameter,SLOT(WriteCmd(uint8_t,uint8_t,const char*,uint8_t,float)),Qt::DirectConnection); //mision ----- map connect(map, SIGNAL(WPProperty(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)), missionUI,SLOT(setWayPointProperty(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t))); connect(missionUI,SIGNAL(WayPointPropertyChanged(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)), map,SIGNAL(setWPProperty(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t))); connect(missionUI,SIGNAL(WPotherPoint(int)), map,SLOT(WPotherPoint(int))); connect(missionUI,SIGNAL(WPDelete(int)), map,SLOT(WPDelete(int))); connect(missionUI,SIGNAL(WPInsert(int)), map,SLOT(WPInsert(int))); connect(missionUI,SIGNAL(WPUpload()), map,SLOT(WPUpload())); connect(missionUI,SIGNAL(WPDownload()), map,SLOT(WPDownload())); connect(missionUI,SIGNAL(WPSave(QString)), map,SLOT(WPSave(QString))); connect(missionUI,SIGNAL(WPLoad(QString)), map,SLOT(WPLoad(QString))); connect(map,SIGNAL(allPoint(QMap)), missionUI,SLOT(setallPoint(QMap))); connect(missionUI,SIGNAL(searchall()), map,SLOT(WPsearchall())); //dlink ----- map connect(map,SIGNAL(signal_WPDownload(uint8_t, uint8_t)), dlink->mavlinknode->Mission,SLOT(ReadCmd(uint8_t, uint8_t)),Qt::DirectConnection); connect(map,SIGNAL(signal_WPUpload(uint8_t,uint8_t,uint32_t)), dlink->mavlinknode->Mission,SLOT(WriteCmd(uint8_t,uint8_t,uint32_t)),Qt::DirectConnection); //生成航线必须在map线程完成,因此不能直接连接 //停下来让ui、运行一下 connect(dlink->mavlinknode->Mission,SIGNAL(receivedPoint(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)), map,SLOT(receivedPoint(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)),Qt::BlockingQueuedConnection); connect(map,SIGNAL(WPProperty(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)), dlink->mavlinknode->Mission,SLOT(transmitPoint(float,float,float,float,int32_t,int32_t,float,uint16_t,uint16_t,uint16_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)),Qt::DirectConnection); connect(dlink->mavlinknode->Mission,SIGNAL(clearWaypoint()), map,SLOT(WPDeleteAll())); connect(dlink->mavlinknode,SIGNAL(addVehicles(int,int)), map,SLOT(addUAV(int,int))); connect(map,SIGNAL(uav_selected(int,int)), dlink->mavlinknode,SLOT(setCurrentSelected(int,int)),Qt::DirectConnection); connect(dlink->mavlinknode->Mission,SIGNAL(sendItemOK(uint16_t,bool)), map,SLOT(WPSendItemOK(uint16_t,bool)),Qt::DirectConnection); //航点确认窗口 connect(map,SIGNAL(setCurrent(int)), commandUI,SLOT(missionConfirm(int)),Qt::DirectConnection); connect(commandUI,SIGNAL(SetCurrentPoint(int)), dlink->mavlinknode->Mission,SLOT(SetCurrentPoint(int)),Qt::DirectConnection); connect(dlink->mavlinknode->Mission,SIGNAL(currentPoint(int)), map,SLOT(WPSetCurrent(int)),Qt::DirectConnection); //==== showmessage===== connect(copk,SIGNAL(showMessage(QString,int)),this,SLOT(showMessage(QString,int))); connect(dlink,SIGNAL(showMessage(QString,int)),this,SLOT(showMessage(QString,int))); connect(map,SIGNAL(showMessage(QString,int)),this,SLOT(showMessage(QString,int))); qDebug() << "main window start"; //监测ssl,用于网络连接 qDebug()<<"QSslSocket="<stop(); delete tts; tts = nullptr; } if(map) { map->close(); delete map; } if(dlink) { //dlink->stopPort(); delete dlink; } if(copk) { copk->close(); delete copk; } QCoreApplication::quit();//退出所有窗口 } void MainWindow::closeEvent(QCloseEvent *event) { event->accept(); QCoreApplication::quit();//退出所有 } void MainWindow::resizeEvent(QResizeEvent *event) { qDebug() << event; Q_UNUSED(event) menuBarUI->setGeometry(0,0,this->width(),100); qDebug() << "resize"; setting->setGeometry(0,menuBarUI->height(), this->width(),this->height() - menuBarUI->height()); checkUI->setGeometry(0,menuBarUI->height(), this->width(),this->height() - menuBarUI->height()); map->setGeometry(0,menuBarUI->height(), this->width()- copk->width(),this->height() - menuBarUI->height()); copk->setGeometry(this->width() - copk->width(),menuBarUI->height(), copk->width(),copk->height()); missionUI->setGeometry(this->width() - copk->width(),menuBarUI->height(), copk->width(),this->height() - menuBarUI->height()); commandUI->setGeometry(this->width() - copk->width(),menuBarUI->height() + copk->height(), copk->width(),this->height() - menuBarUI->height() - copk->height()); toolsui->setGeometry(0,menuBarUI->height(), this->width(),this->height() - menuBarUI->height()); update(); } //这个是不必要的,因为每个部件都有自己相应的动作 void MainWindow::mousePressEvent(QMouseEvent* event) { Q_UNUSED(event) } void MainWindow::keyPressEvent(QKeyEvent *event) //键盘按下事件 { //qDebug() << event; switch(event->key()) { case Qt::Key_Up: qDebug() << "Key_Up"; break; case Qt::Key_Down: qDebug() << "Key_Down"; break; case Qt::Key_Left: qDebug() << "Key_Left"; break; case Qt::Key_Right: qDebug() << "Key_Right"; break; case Qt::Key_D: if(event->modifiers() == Qt::AltModifier) { qInfo() << "alt + D"; } break; case Qt::Key_U : { if(event->modifiers() == Qt::AltModifier) { qInfo() << "atl + U"; } }break; case Qt::Key_P : { if(event->modifiers() == Qt::AltModifier) {//下载参数 qInfo() << "atl + P"; } }break; case Qt::Key_O : { if(event->modifiers() == Qt::AltModifier) {//上传参数 qInfo() << "atl + O"; } }break; case Qt::Key_S: break; case Qt::Key_W: break; case Qt::Key_K : { if(event->modifiers() == Qt::ControlModifier) { } } break; case Qt::Key_Space : { //map->setcu map->SetCurrentPosition(); //根据选中的飞机设置当前位置 } break; case Qt::Key_Equal : { if(event->modifiers() == Qt::ShiftModifier) { } else { map->SetZoom(map->ZoomReal() + 1); } } break; case Qt::Key_Plus : { if(event->modifiers() == Qt::ShiftModifier) { } } break; case Qt::Key_Minus: { if(event->modifiers() == Qt::ShiftModifier) { } else { map->SetZoom(map->ZoomReal() - 1); } } break; case Qt::Key_C: { if(event->modifiers() == Qt::AltModifier) { map->DeleteTrail(); } } break; } } bool MainWindow::event(QEvent *event) { /* switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: { qDebug() <<"CProjectionPicture::event"; QTouchEvent *touchEvent = static_cast(event); QList touchPoints = touchEvent->touchPoints(); if (touchPoints.count() == 2) { //m_bIsTwoPoint = true;//两指时不让移动 const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first(); const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last(); qreal currentScaleFactor = QLineF(touchPoint0.pos(), touchPoint1.pos()).length() / QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length(); if (touchEvent->touchPointStates() & Qt::TouchPointReleased) { if(QLineF(touchPoint0.pos(), touchPoint1.pos()).length() > QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length()) map->SetZoom(map->ZoomReal() + currentScaleFactor); else if(QLineF(touchPoint0.pos(), touchPoint1.pos()).length() < QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length()) map->SetZoom(map->ZoomReal() - currentScaleFactor); qDebug() << "currentScaleFactor" << currentScaleFactor; } update(); } else if(touchPoints.count() == 1){ //m_bIsTwoPoint = false; } return true; } default: break; } */ return QWidget::event(event); } void MainWindow::onTabIndexChanged(const int &index)//界面选择管理 { //记录主界面目录 MainIndex = index; //设置 if(index == 0) setting->show(); else setting->hide(); //自检 if(index == 1) checkUI->show(); else checkUI->hide(); //任务 if(index == 2) { map->setWPLock(false); map->setWPCreate(true); missionUI->show(); } else { map->setWPLock(true); map->setWPCreate(false); missionUI->hide(); } if((index == 2)||(index == 3)) map->show(); else map->hide(); //飞行 if(index == 3) { copk->show(); commandUI->show(); } else { copk->hide(); commandUI->hide(); } //信息 if(index == 4) toolsui->show(); else toolsui->hide(); } void MainWindow::showMessage(const QString &message, int TimeOut) { menuBarUI->showMessage(message,TimeOut); } void MainWindow::beep(void) { QApplication::beep(); } // 16~20Hz左右 运行频率可能太高 void MainWindow::updateUI()//事件驱动式更新数据 { static uint32_t custommode_old = 0; static uint8_t state_old = 0; bool isCustomChanged = false; bool isStateChanged = false; static quint64 lastTime = QDateTime::currentMSecsSinceEpoch(); /* static int frq_count = 0; static qint64 frq_time = 0; frq_count++; if((QDateTime::currentMSecsSinceEpoch() - frq_time) >= 1000) { qDebug() <setAttitude(dlink->mavlinknode->vehicle.attitude.pitch * 57.3, dlink->mavlinknode->vehicle.attitude.roll * 57.3, dlink->mavlinknode->vehicle.attitude.yaw * 57.3); copk->setAltitude(dlink->mavlinknode->vehicle.global_position_int.relative_alt * 10e-4); copk->setAltitudeTarget(dlink->mavlinknode->vehicle.global_position_int.relative_alt * 10e-4 +dlink->mavlinknode->vehicle.nav_controller_output.alt_error); copk->setAirSpeed(dlink->mavlinknode->vehicle.vfr_hud.airspeed,2); copk->setAirSpeedTarget(dlink->mavlinknode->vehicle.vfr_hud.airspeed +dlink->mavlinknode->vehicle.nav_controller_output.aspd_error,2); copk->setVerticalSpeed(dlink->mavlinknode->vehicle.global_position_int.vz * 10e-3); copk->setAlt_err(dlink->mavlinknode->vehicle.nav_controller_output.alt_error); copk->setXTrack(-dlink->mavlinknode->vehicle.nav_controller_output.xtrack_error); copk->setRollTarget(dlink->mavlinknode->vehicle.nav_controller_output.nav_roll); copk->setPitchTarget(dlink->mavlinknode->vehicle.nav_controller_output.nav_pitch); copk->setYawTarget(dlink->mavlinknode->vehicle.nav_controller_output.nav_bearing); QString gps_str; gps_str.clear(); switch (dlink->mavlinknode->vehicle.gps_raw_int.fix_type) { case 1: case 2: case 3: gps_str.append(tr("%1D Fix").arg(dlink->mavlinknode->vehicle.gps_raw_int.fix_type)); break; case 4: gps_str.append(tr("Fixed")); break; case 5: gps_str.append(tr("Float")); break; default: gps_str.append(tr("gps err")); break; } copk->setGPS(gps_str); QString arm_str; arm_str.clear(); uint8_t state = 0; state = (dlink->mavlinknode->vehicle.heartbeat.base_mode&MAV_MODE_FLAG::MAV_MODE_FLAG_SAFETY_ARMED); if(state != state_old) { isStateChanged = true; //解锁后清除航迹 if(state == MAV_MODE_FLAG::MAV_MODE_FLAG_SAFETY_ARMED) { map->DeleteTrail(); } } else { isStateChanged = false; } state_old = state; switch (state) { case MAV_MODE_FLAG_SAFETY_ARMED: arm_str.append(tr("ARM")); /* if(tts) { if((QDateTime::currentMSecsSinceEpoch() - lastTime) >= 5000) { lastTime = QDateTime::currentMSecsSinceEpoch(); QString status; status.append(tr("高度:%1").arg(QString::number(dlink->mavlinknode->vehicle.global_position_int.relative_alt * 0.001,'f',0))); status.append(tr("速度:%1").arg(QString::number(dlink->mavlinknode->vehicle.vfr_hud.airspeed,'f',0))); tts->say(status); } } */ break; case 0: arm_str.append(tr("DISARM")); break; default: break; } copk->setState(arm_str); uint32_t custommode = dlink->mavlinknode->vehicle.heartbeat.custom_mode; if(custommode != custommode_old) { isCustomChanged = true; } else { isCustomChanged = false; } custommode_old = custommode; QString mode_str; switch (custommode) { case 1<<16: mode_str.append(tr("MANUAL")); break; case 2<<16: mode_str.append(tr("ALTCTL")); break; case 3<<16: mode_str.append(tr("POSCTL")); break; case 4<<16: mode_str.append(tr("AUTO")); break; case 5<<16: mode_str.append(tr("ACRO")); break; case 6<<16: mode_str.append(tr("OFFBOARD")); break; case 7<<16: mode_str.append(tr("STABILIZED")); break; case 8<<16: mode_str.append(tr("RATTITUDE")); break; case (4<<16)+(1<<24): mode_str.append(tr("AUTO_READY")); break; case (4<<16)+(2<<24): mode_str.append(tr("AUTO_TAKEOFF")); break; case (4<<16)+(3<<24): mode_str.append(tr("AUTO_LOITER")); break; case (4<<16)+(4<<24): mode_str.append(tr("AUTO_MISSION")); break; case (4<<16)+(5<<24): mode_str.append(tr("AUTO_RTL")); break; case (4<<16)+(6<<24): mode_str.append(tr("AUTO_LAND")); break; case (4<<16)+(7<<24): mode_str.append(tr("AUTO_RTGS")); break; case (4<<16)+(8<<24): mode_str.append(tr("AUTO_FOLLOW_TARGET")); break; default: mode_str.append(tr("unsported")); break; } copk->setMode(mode_str); //这里会一直生成一个,导致无法释放 if(isStateChanged == true) { tts->say(arm_str); } if(isCustomChanged == true) { mode_str.append(tr("flight mode")); tts->say(mode_str); } //经纬度大于正常值,将舍弃 double lat = (double)(dlink->mavlinknode->vehicle.gps_raw_int.lat * 10e-8); double lng = (double)(dlink->mavlinknode->vehicle.gps_raw_int.lon * 10e-8); if(((lat > -90)&&(lat < 90))&&((lng > -180)&&(lng < 180))) { map->setUAVPos(dlink->mavlinknode->vehicle.sysid, dlink->mavlinknode->vehicle.compid, (double)(dlink->mavlinknode->vehicle.gps_raw_int.lat * 10e-8), (double)(dlink->mavlinknode->vehicle.gps_raw_int.lon * 10e-8), (double)(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-4)); } map->setUAVHeading(dlink->mavlinknode->vehicle.sysid, dlink->mavlinknode->vehicle.compid, dlink->mavlinknode->vehicle.attitude.yaw * 57.3); if(MainIndex == 3)//飞行界面 { //刷新时间1Hz //显示状态信息 数据链信号状态,定位信号状态,电池状态,解锁状态,剩余飞行时间等 QString message; message.append(tr("
数据强度:%1\t").arg(QString::number(100))); message.append(tr("定位类型:%1\t").arg(gps_str)); message.append(tr("卫星数目:%1
").arg(QString::number(dlink->mavlinknode->vehicle.gps_raw_int.satellites_visible))); message.append(tr("
电池电压:%1V\t").arg(QString::number(dlink->mavlinknode->vehicle.sys_status.voltage_battery * 0.01))); message.append(tr("剩余时间:%1
").arg(QString::number(0))); showMessage(message); } //设置舵机显示 int ServoPort = 0; uint16_t servos[16]; ServoPort = dlink->mavlinknode->vehicle.servo_output_raw.port; servos[0] = dlink->mavlinknode->vehicle.servo_output_raw.servo1_raw; servos[1] = dlink->mavlinknode->vehicle.servo_output_raw.servo2_raw; servos[2] = dlink->mavlinknode->vehicle.servo_output_raw.servo3_raw; servos[3] = dlink->mavlinknode->vehicle.servo_output_raw.servo4_raw; servos[4] = dlink->mavlinknode->vehicle.servo_output_raw.servo5_raw; servos[5] = dlink->mavlinknode->vehicle.servo_output_raw.servo6_raw; servos[6] = dlink->mavlinknode->vehicle.servo_output_raw.servo7_raw; servos[7] = dlink->mavlinknode->vehicle.servo_output_raw.servo8_raw; servos[8] = dlink->mavlinknode->vehicle.servo_output_raw.servo9_raw; servos[9] = dlink->mavlinknode->vehicle.servo_output_raw.servo10_raw; servos[10] = dlink->mavlinknode->vehicle.servo_output_raw.servo11_raw; servos[11] = dlink->mavlinknode->vehicle.servo_output_raw.servo12_raw; servos[12] = dlink->mavlinknode->vehicle.servo_output_raw.servo13_raw; servos[13] = dlink->mavlinknode->vehicle.servo_output_raw.servo14_raw; servos[14] = dlink->mavlinknode->vehicle.servo_output_raw.servo15_raw; servos[15] = dlink->mavlinknode->vehicle.servo_output_raw.servo16_raw; toolsui->index4->setChannel(ServoPort,servos); } void MainWindow::TotalDistance(double value) { if(MainIndex == 2)//任务界面 { QString message; message.append(tr("
总航程:%1米\t
").arg(value)); message.append(tr("
最远距离:%1米\t
").arg(0)); message.append(tr("
预计飞行时间:%1小时\t
").arg(0)); showMessage(message); } }