Files
gcs-nf/App/MissionUI/MissionUI.cpp
T
2022-05-11 15:12:08 +08:00

828 lines
26 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"));
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
//load qss
QFile file(":/qss/propertyui.qss");
file.open(QFile::ReadOnly);
QTextStream filetext(&file);
QString stylesheet = filetext.readAll();
this->setStyleSheet(stylesheet);
file.close();
CustomButton *btn_load = new CustomButton(this);
CustomButton *btn_save = new CustomButton(this);
CustomButton *btn_upload = new CustomButton(this);
CustomButton *btn_download = new CustomButton(this);
CustomButton *btn_insert = new CustomButton(this);
CustomButton *btn_delete = new CustomButton(this);
CustomButton *btn_clean = new CustomButton(this);
CustomButton *btn_add = new CustomButton(this);
btn_load->setText(tr("load"));
btn_save->setText(tr("save"));
btn_upload->setText(tr("upload"));
btn_download->setText(tr("download"));
btn_insert->setText(tr("insert"));
btn_delete->setText(tr("delete"));
btn_clean->setText(tr("clean"));
btn_add->setText(tr("add"));
btn_load->setFixedSize(80,40);
btn_save->setFixedSize(80,40);
btn_upload->setFixedSize(80,40);
btn_download->setFixedSize(80,40);
btn_insert->setFixedSize(80,40);
btn_delete->setFixedSize(80,40);
btn_clean->setFixedSize(80,40);
btn_add->setFixedSize(80,40);
ui->gridLayout_btn->addWidget(btn_load, 0,0,1,1);
ui->gridLayout_btn->addWidget(btn_save, 1,0,1,1);
ui->gridLayout_btn->addWidget(btn_upload, 2,0,1,1);
ui->gridLayout_btn->addWidget(btn_download,3,0,1,1);
ui->gridLayout_btn->addWidget(btn_insert, 4,0,1,1);
ui->gridLayout_btn->addWidget(btn_delete, 5,0,1,1);
ui->gridLayout_btn->addWidget(btn_clean, 6,0,1,1);
ui->gridLayout_btn->addWidget(btn_add, 7,0,1,1);
ui->gridLayout_btn->setRowStretch(8,1);
connect(btn_load,&CustomButton::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);
}
});
connect(btn_save,&CustomButton::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);
}
});
connect(btn_upload,&CustomButton::clicked,[=](){
emit WPUpload();
});
connect(btn_download,&CustomButton::clicked,[=](){
QTableWidget *widget;
int tab_idx =ui->tabWidget->currentIndex();
switch (tab_idx) {
case 0:
widget = tablelist.value(1);
break;
case 1:
widget = tablelist.value(3);
break;
case 2:
widget = tablelist.value(4);
break;
case 3:
widget = tablelist.value(5);
break;
case 4:
widget = tablelist.value(6);
break;
default:
break;
}
while (widget->rowCount() > 0) {
widget->removeRow(widget->currentRow());
}
emit WPDownload();
});
connect(btn_insert,&CustomButton::clicked,[=](){
emit WPInsert();
int group = 3;
//根据tabwidget
int tab_idx =ui->tabWidget->currentIndex();
switch (tab_idx) {
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 getAllPoints(group);
});
connect(btn_delete,&CustomButton::clicked,[=](){
QTableWidget *widget;
//根据tabwidget
int tab_idx =ui->tabWidget->currentIndex();
switch (tab_idx) {
case 0:
widget = tablelist.value(1);
break;
case 1:
widget = tablelist.value(3);
break;
case 2:
widget = tablelist.value(4);
break;
case 3:
widget = tablelist.value(5);
break;
case 4:
widget = tablelist.value(6);
break;
default:
break;
}
int idx = widget->currentRow();
widget->removeRow(idx);
emit WPDelete();
//删除完成后,刷新一次所有航点
emit getAllPoints(tablelist.key(widget));
});
connect(btn_clean,&CustomButton::clicked,[=](){
QTableWidget *widget;
//根据tabwidget
int tab_idx =ui->tabWidget->currentIndex();
switch (tab_idx) {
case 0:
widget = tablelist.value(1);
break;
case 1:
widget = tablelist.value(3);
break;
case 2:
widget = tablelist.value(4);
break;
case 3:
widget = tablelist.value(5);
break;
case 4:
widget = tablelist.value(6);
break;
default:
break;
}
while (widget->rowCount() > 0) {
widget->removeRow(widget->currentRow());
}
emit WPDeleteAll();
});
connect(btn_add,&CustomButton::clicked,[=](){
emit WPAdd();
int group = 3;
int tab_idx =ui->tabWidget->currentIndex();
switch (tab_idx) {
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 getAllPoints(group);
});
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)
{
if(tablelist.key(table) == 1)//围栏
{
table->setColumnCount(5); //设置列数为7
table->setGeometry(QRect(10,455,740,95)); //设置tableWidget的大小
table->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中模式为选中行
table->setSelectionMode ( QAbstractItemView::SingleSelection); //设置选择模式,选择单行
table->setAlternatingRowColors(true);
table->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能编辑
table->setMouseTracking(true);
table->setFocus();
table->setFocusPolicy(Qt::StrongFocus);
table->setStyleSheet("QTableWidget::item:selected { background-color: rgb(85, 255, 127); color: rgb(255, 255, 255); } ");
table->setColumnWidth(0,200); //设置第1列的列宽(group)
table->setColumnWidth(1,200); //设置第2列的列宽(par1)
table->setColumnWidth(2,150); //设置第3列的列宽(par2)
table->setColumnWidth(3,150); //设置第4列的列宽(lat)
table->setColumnWidth(4,150); //设置第5列的列宽(lng)
table->setHorizontalHeaderLabels(QStringList() <<tr("group")<<tr("inclusion")<<tr("par")<<tr("lat")<<tr("lng"));
QHeaderView* V_headerView = table->verticalHeader();
V_headerView->setHidden(true); //行名隐藏
QHeaderView* H_headerView = table->horizontalHeader();
H_headerView->setDefaultAlignment(Qt::AlignLeft); //表头信息显示居中靠左
H_headerView->setHighlightSections(false); //不高亮选中内容的所在列标题
H_headerView->setStretchLastSection(true);
connect(table,&QTableWidget::itemSelectionChanged,
this,&MissionUI::itemSelectionChanged);
connect(table,&QTableWidget::itemDoubleClicked,
this,&MissionUI::itemDoubleClicked);
connect(table,&QTableWidget::itemClicked,
this,&MissionUI::itemClicked);
}
else
{
table->setColumnCount(9); //设置列数为7
table->setGeometry(QRect(10,455,740,95)); //设置tableWidget的大小
table->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中模式为选中行
table->setSelectionMode ( QAbstractItemView::SingleSelection); //设置选择模式,选择单行
table->setAlternatingRowColors(true);
table->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能编辑
table->setMouseTracking(true);
table->setFocus();
table->setFocusPolicy(Qt::StrongFocus);
table->setStyleSheet("QTableWidget::item:selected { background-color: rgb(85, 255, 127); color: rgb(255, 255, 255); } ");
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"));
QHeaderView* V_headerView = table->verticalHeader();
V_headerView->setHidden(true); //行名隐藏
QHeaderView* H_headerView = table->horizontalHeader();
H_headerView->setDefaultAlignment(Qt::AlignLeft); //表头信息显示居中靠左
H_headerView->setHighlightSections(false); //不高亮选中内容的所在列标题
H_headerView->setStretchLastSection(true);
connect(table,&QTableWidget::itemSelectionChanged,
this,&MissionUI::itemSelectionChanged);
connect(table,&QTableWidget::itemDoubleClicked,
this,&MissionUI::itemDoubleClicked);
connect(table,&QTableWidget::itemClicked,
this,&MissionUI::itemClicked);
}
}
}
}
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("航点");
break;
case 20:
cmdName = tr("返航");
break;
case 21:
cmdName = tr("降落");
break;
case 22:
cmdName = tr("起飞");
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("开加力");
break;
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);
}
}
}
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)
{
widget->selectRow(idx - 1);
}
//settableGroup(group);//切换会引起变化事件,导致重新刷新
}
void MissionUI::settableGroup(int group)
{
int index = 0;
switch (group) {
case 1:
index = 0;
break;
case 3:
index = 1;
break;
case 4:
index = 2;
break;
case 5:
index = 3;
break;
case 6:
index = 4;
break;
default:
break;
}
ui->tabWidget->setCurrentIndex(index);
}
void MissionUI::on_tabWidget_tabBarClicked(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;
}
QTableWidget *widget = tablelist.value(group);
int idx = widget->currentRow() + 1;
qDebug() << "tabWidget_currentChanged" << group << idx;
emit waypointSelect(group,idx);
}
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;
}
QTableWidget *widget = tablelist.value(group);
int idx = widget->currentRow() + 1;
qDebug() << "tabWidget_currentChanged" << group << idx;
//emit waypointSelect(group,idx);
}
void MissionUI::itemSelectionChanged()
{
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
int group = tablelist.key(widget);
int idx = widget->currentRow() + 1;
qDebug() << "itemSelectionChanged" << group << idx;
//emit waypointSelect(group,idx);
}
void MissionUI::itemClicked(QTableWidgetItem *item)
{
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
int group = tablelist.key(widget);
int idx = widget->currentRow() + 1;
emit waypointSelect(group,idx);//告诉底层要切换航点,切换航点后,会对表格进行设置,这个有问题,会导致表格重复刷新
}
void MissionUI::itemDoubleClicked(QTableWidgetItem *item)
{
QTableWidget *widget = qobject_cast<QTableWidget *>(sender());
int group = tablelist.key(widget);
int idx = widget->currentRow() + 1;
//emit waypointSelect(group,idx);//切换过去
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->setStyleSheet("background-color: #FFFFFF;font :15px 黑体;");
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();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam1(str);//能够正常转换成数字再修改
}
}
});
}
}
else//不能转成数字
{
if(column == 1)
{
QComboBox *combox = new QComboBox(widget);
combox->addItem(tr("航点"),16);
combox->addItem(tr("返航"),20);
combox->addItem(tr("降落"),21);
combox->addItem(tr("起飞"),22);
combox->setCurrentIndex(combox->findText(itemValue.toString()));
combox->setStyleSheet("background-color: #FFFFFF;font :15px 黑体;");
widget->removeCellWidget(row,column);
widget->setCellWidget(row,column,combox);
connect(combox,&QComboBox::currentTextChanged,[=]{
QString str = combox->currentText();
widget->removeCellWidget(row,column);
emit setCommand(str);//直接修改底层,让底层返回数据更新到界面
});
connect(combox,&QComboBox::editTextChanged,[=]{
QString str = combox->currentText();
widget->removeCellWidget(row,column);
emit setCommand(str);//直接修改底层,让底层返回数据更新到界面
});
}
else if(column == 2)
{
QComboBox *combox = new QComboBox(widget);
combox->addItem(tr("保持"),0);
combox->addItem(tr("表速"),-1);
combox->addItem(tr("快升"),-2);
combox->addItem(tr("开加力"),-3);
combox->addItem(tr("关加力"),-4);
combox->setCurrentIndex(combox->findText(itemValue.toString()));
combox->setStyleSheet("background-color: #FFFFFF;font :15px 黑体;");
widget->removeCellWidget(row,column);
widget->setCellWidget(row,column,combox);
connect(combox,&QComboBox::currentTextChanged,[=]{
QString str = combox->currentText();
widget->removeCellWidget(row,column);
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->setStyleSheet("background-color: #FFFFFF;font :15px 黑体;");
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();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam2(str);//能够正常转换成数字再修改
}
}
});
}
else if(column == 4)
{
connect(line,&QLineEdit::editingFinished,[=](){
if(line)
{
QString str = line->text();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam3(str);//能够正常转换成数字再修改
}
}
});
}
else if(column == 5)
{
connect(line,&QLineEdit::editingFinished,[=](){
if(line)
{
QString str = line->text();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam4(str);//能够正常转换成数字再修改
}
}
});
}
else if(column == 6)
{
connect(line,&QLineEdit::editingFinished,[=](){
if(line)
{
QString str = line->text();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam5(str);//能够正常转换成数字再修改
}
}
});
}
else if(column == 7)
{
connect(line,&QLineEdit::editingFinished,[=](){
if(line)
{
QString str = line->text();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam6(str);//能够正常转换成数字再修改
}
}
});
}
else if(column == 8)
{
connect(line,&QLineEdit::editingFinished,[=](){
if(line)
{
QString str = line->text();
bool ok = false;
str.toDouble(&ok);
if(ok)
{
widget->removeCellWidget(row,column);
emit setParam7(str);//能够正常转换成数字再修改
}
}
});
}
}
else//不能转成数字
{
qDebug() << "input error";
}
}
}