一.软件功能规划
1.Sps文件装载模块,需实现的功能有:
(1)选择文件路径下的sps文件,并将其内容以表格的形式显示在主界面中,显示内容包括序号,线号,桩号,索引等。
(2)在每个显示的炮点信息后都能输入爆炸机号,并在点击确认放炮按钮后,将这一串数据以协议的形式发送。
(3)将已放炮的炮点进行标识,便于区分。
2.SPS流程图
3.待读取的SPS文件格式示例
二.各部分功能实现(源代码)
1.MainWindow的ui界面重设置大小
resize(800,600);
2.QT实现选择并读取文件功能
(1)首先在MainWindow添加菜单栏动作
之后将该动作拖至菜单栏即可
(2)接着编辑其triggered()函数,在动作上右键转到槽
(3)编辑选择文件的槽函数
//首先引入头文件(在槽函数外)
#include <QFileDialog>
#include <QFile>
//打开文件选择界面(此处可选择只查看TXT和S文件或所有类型文件)
QString fileName= QFileDialog::getOpenFileName(this,tr("文件"),"",tr("只查看(*.txt *.s );;所有类型文件(*.*)"));
//接着以只读的方式打开选择的文件(记得要关闭文件,虽然我也不太清楚不关会怎么样~)
QFile file(fileName);
file.open(QIODevice::ReadOnly);
while(!file.atEnd()) //循环读取到文件结束时
{
QString letter = file.readLine(); //将文件一行一行的读取出来,直到循环结束
QString letter2 = letter.mid(0,1);//从第0位开始,截取1个字符串
if(letter2 =="S")//判断开始的字符串
{
QString string2 =letter.mid(1,25); //此时已将S字符串跳过
QString sLine1 = string2.mid(0,10);
QString sNum1 = string2.mid(13,11);
QString sInd1 = string2.mid(24,1); //分别提取三个参数,否则少一行数据,因为上面已经读了一行
while(!file.atEnd()) //循环读取文件,将数据保存为一长串字符串
{
QString string = file.readLine();
QString string2 =string.mid(1,25);
QString sLine2 +=string2.mid(0,10)+"
";
QString sNum2 +=string2.mid(13,11)+"
";
QString sInd2 += string2.mid(24,1)+"
"; //循环写入字符串组
}
}
}
QString sLine3 = sLine2.prepend(sLine1 + "
");
QString sNum3 = sNum2.prepend(sNum1 + "
");
QString sInd3 = sInd2.prepend(sInd1 + "
"); //将括号里的内容插到字符串前面,此时为sps文件的全部数据
assignment (sLine3,sNum3,sInd3); //调用函数输入参数,显示在表格中
file.close(); //将sps文件关闭
//注意为了便于理解,此时的参数变量都是局部变量无法被外部调用的
//可根据需要将其定义为成员变量或全局变量
3.QT实现自定义函数向TableView表格传递并显示参数
(1)首先在头文件中声明函数
void assignment(QString sline3,QString snum3,QString sind3); //实现功能是向表格传参
(2)右键函数名,选择Refactor,在XXX.cpp中添加定义
此时将跳转到cpp文件,并自动生成函数,只需添加定义函数体即可
(3)QT自定义函数体实现
void MainWindow::assignment (QString sline3,QString snum3,QString sind3) //自定义函数,功能是向表格传参
{
//tableview的表格画为点划线,即虚线
ui->tableView->setGridStyle(Qt::DotLine);
//实现向tableview中插入数据
model = new QStandardItemModel(this); //QTableView是界面视图组件,其关联的数据模型是QStandardItemModel
//为tableview添加表头:
QStringList labels = QObject::trUtf8("SP,SL,SN,SI,SEQ,BUTTON").simplified().split(","); //创建字符串列表,设定各个表头
model->setHorizontalHeaderLabels(labels); //将字符串列表插入到tableview中(完成表头设置)
//为tableview添加表内容:
QStringList list1 = sline3.split('
'); //以换行符为界分割参数长字符串
QStringList list2 = snum3.split('
'); //并分别保存到字符串列表中
QStringList list3 = sind3.split('
'); //得到三种各个分开的参数
for(int j=0; j<list1.count();j++) //循环输入,直到参数输完
{
QStandardItem* item1 = 0;
//括号内为强制类型转换,使item1变为j+1(注意item1的值改变了四次)
item1 = new QStandardItem(QString("%1").arg(j+1));
model->setItem(j,0,item1); //输入第一列(即输入j+1)
item1 = new QStandardItem(list1[j]);
model->setItem(j,1,item1); //输入第二列(输入list1)
item1 = new QStandardItem(list2[j]);
model->setItem(j,2,item1); //输入第三列(输入list2)
item1 = new QStandardItem(list3[j]);
model->setItem(j,3,item1); //输入第四列(输入list3)
//setitem(x,y,z)分别表示行数,列数,参数
//以上tableview数据显示完毕
QPushButton *btn = new QPushButton("确定"); //在每行最后一列循环插入button控件
int btn_row=j-1;
int btn_column=5; //代表插入的列数是第5列(从0开始)
btn->setAutoFillBackground(true);
//嵌入可视化组件,适合用来做不变数据的显示
ui->tableView->setIndexWidget(model->index(btn_row,btn_column), btn); //循环插入Button控件
ui->tableView->setModel(model);
connect(btn,SIGNAL(clicked()),this,SLOT(showlist())); //信号槽实现点击按钮则调用向串口传值函数,与上面内容无关可忽略
}
ui->tableView->show(); //别忘记将tableview在界面中显示出来
}
三.实现结果展示
以上是BlastingSystem的SPS文件装载模块。