QT实现读取sps文件并将数据显示在TableView中(复习)

一.软件功能规划

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文件装载模块。

原文地址:https://www.cnblogs.com/Damonblogs/p/13637866.html