581 lines
16 KiB
C++
581 lines
16 KiB
C++
#include "MissionUI.h"
|
|
#include "ui_MissionUI.h"
|
|
|
|
MissionUI::MissionUI(QWidget *parent) :
|
|
QWidget(parent),
|
|
ui(new Ui::MissionUI)
|
|
{
|
|
ui->setupUi(this);
|
|
setWindowTitle(tr("Mission Table"));
|
|
|
|
tablelist.insert(1,ui->tableWidget_1);
|
|
tablelist.insert(3,ui->tableWidget_3);
|
|
tablelist.insert(4,ui->tableWidget_4);
|
|
tablelist.insert(5,ui->tableWidget_5);
|
|
tablelist.insert(6,ui->tableWidget_6);
|
|
|
|
ui->tabWidget->setCurrentIndex(1);
|
|
|
|
foreach (QTableWidget *table, tablelist) {
|
|
if(table)
|
|
{
|
|
table->setColumnCount(9); //设置列数为7
|
|
table->setGeometry(QRect(10,455,740,95)); //设置tableWidget的大小
|
|
table->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中模式为选中行
|
|
table->setAlternatingRowColors(true);
|
|
table->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能编辑
|
|
|
|
table->setColumnWidth(0,45); //设置第一列的列宽(num)
|
|
table->setColumnWidth(1,80); //设置第二列的列宽(cmd)
|
|
table->setColumnWidth(2,80); //设置第三列的列宽(par1)
|
|
table->setColumnWidth(3,80); //设置第四列的列宽(par2)
|
|
table->setColumnWidth(4,80); //设置第五列的列宽(par3)
|
|
table->setColumnWidth(5,80); //设置第六列的列宽(par4)
|
|
table->setColumnWidth(6,150); //设置第七列的列宽(lat)
|
|
table->setColumnWidth(7,150); //设置第八列的列宽(lng)
|
|
table->setColumnWidth(8,80); //设置第九列的列宽(alt)
|
|
|
|
|
|
table->setHorizontalHeaderLabels(QStringList() <<tr("number")<<tr("command")<<tr("par1")<<tr("par2")<<tr("par3")<<tr("par4")<<tr("lat")<<tr("lng")<<tr("alt"));
|
|
table->setFont(QFont("黑体",12,3)); //设置字体
|
|
QHeaderView* V_headerView = table->verticalHeader();
|
|
V_headerView->setHidden(true); //行名隐藏
|
|
|
|
QHeaderView* H_headerView = table->horizontalHeader();
|
|
H_headerView->setStretchLastSection(true);
|
|
H_headerView->setDefaultAlignment(Qt::AlignLeft); //表头信息显示居中靠左
|
|
|
|
|
|
|
|
connect(table,&QTableWidget::itemSelectionChanged,
|
|
this,&MissionUI::itemSelectionChanged);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
MissionUI::~MissionUI()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void MissionUI::closeEvent(QCloseEvent *event)
|
|
{
|
|
event->ignore();
|
|
this->setHidden(true);
|
|
}
|
|
|
|
void MissionUI::resizeEvent(QResizeEvent *event)
|
|
{
|
|
|
|
}
|
|
|
|
void MissionUI::pointCreate(float param1,float param2,float param3,float param4,
|
|
int32_t x,int32_t y,float z,
|
|
uint16_t seq,
|
|
uint16_t group,
|
|
uint16_t command,
|
|
uint8_t target_system,
|
|
uint8_t target_component,
|
|
uint8_t frame,
|
|
uint8_t current,
|
|
uint8_t autocontinue,
|
|
uint8_t mission_type)
|
|
{
|
|
QTableWidget *tableWidget;
|
|
|
|
foreach (QTableWidget *table, tablelist) {
|
|
if(table)
|
|
{
|
|
if(tablelist.value(mission_type) == table)
|
|
{
|
|
tableWidget = table;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int idx = seq -1;
|
|
|
|
tableWidget->setRowCount(tableWidget->rowCount()+1); //设置行数+1
|
|
tableWidget->setItem(idx,0,new QTableWidgetItem(QString::number(seq))); //第一列的内容设置为index
|
|
|
|
QString cmdName;
|
|
switch (command) {
|
|
case 16:
|
|
cmdName = tr("waypoint");
|
|
break;
|
|
case 20:
|
|
cmdName = tr("return");
|
|
break;
|
|
case 21:
|
|
cmdName = tr("landing");
|
|
break;
|
|
case 22:
|
|
cmdName = tr("takeoff");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
tableWidget->removeCellWidget(idx,1);
|
|
tableWidget->setItem(idx,1,new QTableWidgetItem(cmdName));
|
|
|
|
if(command == 16)
|
|
{
|
|
QString par1Name;
|
|
switch ((int)param1) {
|
|
case 0:
|
|
par1Name = tr("保持");
|
|
break;
|
|
case -1:
|
|
par1Name = tr("表速");
|
|
break;
|
|
case -2:
|
|
par1Name = tr("快升");
|
|
break;
|
|
case -3:
|
|
par1Name = tr("开加力");
|
|
case -4:
|
|
par1Name = tr("关加力");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
tableWidget->removeCellWidget(idx,2);
|
|
tableWidget->setItem(idx,2,new QTableWidgetItem(par1Name));
|
|
}
|
|
else if(command == 20)
|
|
{
|
|
tableWidget->removeCellWidget(idx,2);
|
|
tableWidget->setItem(idx,2,new QTableWidgetItem(QString::number(param1)));
|
|
}
|
|
else if(command == 21)
|
|
{
|
|
tableWidget->removeCellWidget(idx,2);
|
|
tableWidget->setItem(idx,2,new QTableWidgetItem(QString::number(param1)));
|
|
}
|
|
else if(command == 22)
|
|
{
|
|
tableWidget->removeCellWidget(idx,2);
|
|
tableWidget->setItem(idx,2,new QTableWidgetItem(QString::number(param1)));
|
|
}
|
|
|
|
tableWidget->removeCellWidget(idx,3);
|
|
tableWidget->setItem(idx,3,new QTableWidgetItem(QString::number(param2)));
|
|
|
|
tableWidget->removeCellWidget(idx,4);
|
|
tableWidget->setItem(idx,4,new QTableWidgetItem(QString::number(param3)));
|
|
|
|
tableWidget->removeCellWidget(idx,5);
|
|
tableWidget->setItem(idx,5,new QTableWidgetItem(QString::number(param4)));
|
|
|
|
tableWidget->removeCellWidget(idx,6);
|
|
tableWidget->setItem(idx,6,new QTableWidgetItem(QString::number(x * 10e-8,'f',7)));
|
|
|
|
tableWidget->removeCellWidget(idx,7);
|
|
tableWidget->setItem(idx,7,new QTableWidgetItem(QString::number(y * 10e-8,'f',7)));
|
|
|
|
tableWidget->removeCellWidget(idx,8);
|
|
tableWidget->setItem(idx,8,new QTableWidgetItem(QString::number(z)));
|
|
|
|
|
|
for (int i = 0;i<tableWidget->rowCount();i++)
|
|
{
|
|
if(tableWidget->item(i,0)==NULL|| //判断指向该cell的指针是否为空
|
|
(tableWidget->item(i,0)&&
|
|
tableWidget->item(i,0)->text()==tr(""))) //判断该cell的text是否为空
|
|
{
|
|
tableWidget->removeRow(i);
|
|
}
|
|
}
|
|
|
|
for (int i = 0;i<tableWidget->rowCount();i++)
|
|
{
|
|
QTableWidgetItem* pItem = tableWidget->item(i, 0);
|
|
if(pItem)
|
|
pItem->setFlags(pItem->flags() & (~Qt::ItemIsEditable));
|
|
}
|
|
|
|
}
|
|
|
|
void MissionUI::pointDelete(int idx)
|
|
{
|
|
/*
|
|
if(tableWidget->rowAt(idx) != -1)
|
|
{
|
|
tableWidget->removeRow(idx); //删除掉了表格信息
|
|
}
|
|
*/
|
|
}
|
|
|
|
void MissionUI::setCurrent(int group,int idx)
|
|
{
|
|
QTableWidget *widget = tablelist.value(group);
|
|
if(widget)
|
|
{
|
|
/*
|
|
qDebug() << "select" << group << idx;
|
|
|
|
QTableWidgetItem *item = widget->item(idx,0);
|
|
|
|
if(item)
|
|
{
|
|
widget->setCurrentItem(item);
|
|
}
|
|
*/
|
|
}
|
|
}
|
|
|
|
|
|
void MissionUI::on_tableWidget_3_itemChanged(QTableWidgetItem *item)
|
|
{
|
|
//容易产生死锁
|
|
qDebug() << "item changed" << item->data(Qt::DisplayRole);
|
|
|
|
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
|
|
|
|
int group = tablelist.key(widget);
|
|
|
|
}
|
|
|
|
void MissionUI::on_tabWidget_currentChanged(int index)
|
|
{
|
|
int group = 3;
|
|
|
|
switch (index) {
|
|
case 0:
|
|
group = 1;
|
|
break;
|
|
case 1:
|
|
group = 3;
|
|
break;
|
|
case 2:
|
|
group = 4;
|
|
break;
|
|
case 3:
|
|
group = 5;
|
|
break;
|
|
case 4:
|
|
group = 6;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
emit groupChanged(group);
|
|
}
|
|
|
|
void MissionUI::on_pushButton_load_clicked()
|
|
{
|
|
QFileDialog *dlg = new QFileDialog();
|
|
QString fileName = dlg->getOpenFileName(this, tr("Selete Way Point File..."),
|
|
"./plan/",
|
|
tr("plan file (*.plan)"));
|
|
if(!fileName.isEmpty())
|
|
{
|
|
emit WPLoad(fileName);
|
|
}
|
|
}
|
|
|
|
void MissionUI::on_pushButton_save_clicked()
|
|
{
|
|
QFileDialog *dlg = new QFileDialog();
|
|
|
|
QString fileName = dlg->getSaveFileName(this, tr("Selete Way Point File..."),
|
|
"./plan/",
|
|
tr("plan file (*.plan)"));
|
|
if(!fileName.isEmpty())
|
|
{
|
|
emit WPSave(fileName);
|
|
}
|
|
}
|
|
|
|
void MissionUI::on_pushButton_upload_clicked()
|
|
{
|
|
emit WPUpload();
|
|
}
|
|
|
|
void MissionUI::on_pushButton_download_clicked()
|
|
{
|
|
emit WPDownload();
|
|
}
|
|
|
|
void MissionUI::on_pushButton_insert_clicked()
|
|
{
|
|
emit WPInsert();
|
|
}
|
|
|
|
void MissionUI::on_pushButton_delete_clicked()
|
|
{
|
|
//清除一下,
|
|
emit WPDelete();
|
|
}
|
|
|
|
void MissionUI::on_pushButton_add_clicked()
|
|
{
|
|
emit WPAdd();
|
|
}
|
|
|
|
void MissionUI::on_pushButton_clean_clicked()
|
|
{
|
|
emit WPDeleteAll();
|
|
}
|
|
|
|
|
|
void MissionUI::itemSelectionChanged()
|
|
{
|
|
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
|
|
|
|
int group = tablelist.key(widget);
|
|
|
|
int idx = widget->currentRow() + 1;
|
|
emit waypointSelect(group,idx);
|
|
|
|
}
|
|
|
|
void MissionUI::on_tableWidget_3_cellChanged(int row, int column)
|
|
{
|
|
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
|
|
int group = tablelist.key(widget);
|
|
int idx = widget->currentRow() + 1;
|
|
|
|
qDebug() << group << row << column;
|
|
|
|
/*
|
|
switch (column) {//用列数判断参数类型
|
|
case 0:
|
|
|
|
break;
|
|
case 1:
|
|
emit setCommand(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 2:
|
|
emit setParam1(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 3:
|
|
emit setParam2(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 4:
|
|
emit setParam3(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 5:
|
|
emit setParam4(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 6:
|
|
emit setParam5(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 7:
|
|
emit setParam6(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
case 8:
|
|
emit setParam7(widget->item(row,column)->data(Qt::DisplayRole));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
*/
|
|
}
|
|
|
|
void MissionUI::on_tableWidget_3_itemDoubleClicked(QTableWidgetItem *item)
|
|
{
|
|
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
|
|
int group = tablelist.key(widget);
|
|
int idx = widget->currentRow() + 1;
|
|
|
|
int row=item->row();
|
|
int column = item->column();
|
|
|
|
if((column == 1)||(column == 2))//如果是第一个或者第二个,那么有操作
|
|
{
|
|
QVariant itemValue = item->data(Qt::DisplayRole);
|
|
|
|
bool ok = false;
|
|
qreal realValue = itemValue.toDouble(&ok);
|
|
|
|
if(ok)//能够转成数字
|
|
{
|
|
if(column == 2)
|
|
{
|
|
QLineEdit *line = new QLineEdit(widget);
|
|
line->setText(itemValue.toString());
|
|
|
|
widget->removeCellWidget(row,column);
|
|
widget->setCellWidget(row,column,line);
|
|
|
|
opwidget = widget;
|
|
opitem = item;
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam2(str);
|
|
}
|
|
|
|
});
|
|
}
|
|
}
|
|
else//不能转成数字
|
|
{
|
|
if(column == 1)
|
|
{
|
|
QComboBox *cmdBox = new QComboBox(widget);
|
|
cmdBox->addItem(tr("waypoint"),16);
|
|
cmdBox->addItem(tr("return"),20);
|
|
cmdBox->addItem(tr("landing"),21);
|
|
cmdBox->addItem(tr("takeoff"),22);
|
|
cmdBox->setCurrentIndex(cmdBox->findText(itemValue.toString()));
|
|
widget->removeCellWidget(row,column);
|
|
widget->setCellWidget(row,column,cmdBox);
|
|
|
|
connect(cmdBox,&QComboBox::currentTextChanged,[=]{
|
|
QString str = cmdBox->currentText();
|
|
emit setCommand(str);//直接修改底层,让底层返回数据更新到界面
|
|
});
|
|
}
|
|
else if(column == 2)
|
|
{
|
|
QComboBox *par1Box = new QComboBox(widget);
|
|
par1Box->addItem(tr("保持"),0);
|
|
par1Box->addItem(tr("表速"),-1);
|
|
par1Box->addItem(tr("快升"),-2);
|
|
par1Box->addItem(tr("开加力"),-3);
|
|
par1Box->addItem(tr("关加力"),-4);
|
|
par1Box->setCurrentIndex(par1Box->findText(itemValue.toString()));
|
|
widget->removeCellWidget(row,column);
|
|
widget->setCellWidget(row,column,par1Box);
|
|
|
|
connect(par1Box,&QComboBox::currentTextChanged,[=]{
|
|
QString str = par1Box->currentText();
|
|
emit setParam1(str);
|
|
|
|
});
|
|
}
|
|
}
|
|
|
|
qDebug() << "clicked" << row << column << itemValue << ok;
|
|
}
|
|
else//后面的参数,应该都是数字
|
|
{
|
|
if(column == 0)//第一个不能编辑
|
|
{
|
|
return;
|
|
}
|
|
|
|
QVariant itemValue = item->data(Qt::DisplayRole);
|
|
|
|
bool ok = false;
|
|
qreal realValue = itemValue.toDouble(&ok);
|
|
|
|
if(ok)//能够转成数字
|
|
{
|
|
QLineEdit *line = new QLineEdit(widget);
|
|
line->setText(itemValue.toString());
|
|
|
|
widget->removeCellWidget(row,column);
|
|
widget->setCellWidget(row,column,line);
|
|
|
|
opwidget = widget;
|
|
opitem = item;
|
|
|
|
if(column == 3)
|
|
{
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam2(str);
|
|
}
|
|
});
|
|
}
|
|
else if(column == 4)
|
|
{
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam3(str);
|
|
}
|
|
|
|
});
|
|
}
|
|
else if(column == 5)
|
|
{
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam4(str);
|
|
}
|
|
|
|
});
|
|
}
|
|
else if(column == 6)
|
|
{
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam5(str);
|
|
}
|
|
|
|
});
|
|
}
|
|
else if(column == 7)
|
|
{
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam6(str);
|
|
}
|
|
|
|
});
|
|
}
|
|
else if(column == 8)
|
|
{
|
|
connect(line,&QLineEdit::editingFinished,[=](){
|
|
if(line)
|
|
{
|
|
QString str = line->text();
|
|
emit setParam7(str);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
else//不能转成数字
|
|
{
|
|
qDebug() << "input error";
|
|
}
|
|
}
|
|
}
|
|
|
|
void MissionUI::setCommandBox(int idx)
|
|
{
|
|
QComboBox *combox = qobject_cast<QComboBox *>(sender());
|
|
QString str = combox->currentText();
|
|
|
|
if(opwidget)
|
|
{
|
|
emit setCommand(str);//直接修改底层,让底层返回数据更新到界面
|
|
}
|
|
}
|
|
|
|
void MissionUI::setParam1Box(int idx)
|
|
{
|
|
QComboBox *combox = qobject_cast<QComboBox *>(sender());
|
|
QString str = combox->currentText();
|
|
|
|
if(opwidget)
|
|
{
|
|
emit setParam1(str);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|