#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(); ui->pushButton_load->setFixedSize(80,40); ui->pushButton_save->setFixedSize(80,40); ui->pushButton_upload->setFixedSize(80,40); ui->pushButton_download->setFixedSize(80,40); ui->pushButton_insert->setFixedSize(80,40); ui->pushButton_delete->setFixedSize(80,40); ui->pushButton_clean->setFixedSize(80,40); ui->pushButton_add->setFixedSize(80,40); 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->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() <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); /* connect(table,&QTableWidget::itemEntered, 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;irowCount();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::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() { 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 WPDownload(); } void MissionUI::on_pushButton_insert_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); } void MissionUI::on_pushButton_delete_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)); } void MissionUI::on_pushButton_add_clicked() { emit WPAdd(); 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); } void MissionUI::on_pushButton_clean_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(); } void MissionUI::itemSelectionChanged() { QTableWidget *widget = qobject_cast(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(sender()); int group = tablelist.key(widget); int idx = widget->currentRow() + 1; emit waypointSelect(group,idx);//告诉底层要切换航点,切换航点后,会对表格进行设置,这个有问题,会导致表格重复刷新 } void MissionUI::itemDoubleClicked(QTableWidgetItem *item) { QTableWidget *widget = qobject_cast(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"; } } }