zoukankan      html  css  js  c++  java
  • 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文件装载模块。

  • 相关阅读:
    GIT和SVN之间的五个基本区别
    nolock的使用
    Net线程足迹 传递参数至线程
    .NET中的三种Timer的区别和用法(转)
    探索并发编程(六)------Java多线程性能优化
    探索并发编程(七)------分布式环境中并发问题
    Lock与synchronized 的区别
    常用EXE文件反编译工具
    Socket原理
    开源的力量(随时更新)
  • 原文地址:https://www.cnblogs.com/Damonblogs/p/13637866.html
Copyright © 2011-2022 走看看