欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt读取txt文件中数据并绘制图像

程序员文章站 2022-06-11 13:31:00
...

由于毕业设计需要,接触到Qt学习。基础比较差。遇到一系列问题,都咬牙慢慢啃下来了。

由于需要将光谱仪采集到的原始数据进行背景扣除,就涉及到文本文件读取工作啦。几乎把所有的帖子都看完了,天资愚钝,还是没整出来。

偶然一天发现Qt中QString的mid,left,right剪切操作。得到了相关灵感。Qt介绍用法如下。

Qt读取txt文件中数据并绘制图像

Qt读取txt文件中数据并绘制图像

Qt读取txt文件中数据并绘制图像

就是可以截取对应字符串。

在我通过光谱仪得到的测试数据中,每行为157.60      618.00 ,第一列为拉曼位移,第二列为散射强度,列间距为12.    

所以,可以通过

double xplot=str.right(firstNum_size).toDouble();

double yplot=str.mid(12,secNum_size).toDouble();

为了解放双手,在后续优化程序过程中,添加了判断数据列数和列间距的小代码。因为有时候会得到多列数据。

贴上自己建的头文件和.cpp文件。


readTxt.h

#ifndef READTXT_H
#define READTXT_H
#include<QString>
#include<QList>
QList<int> readTxt(QString path, int Ycolumns, int YoutCol, int colSize,
 int outputNum);
#endif // READTXT_H

readTxt.cpp

#include"readTxt.h"
#include <QFile>
#include<QVector>
#include<QList>
#include<QDebug>
#include<QString>
#include<QFileDialog>

QList<int> readTxt(QString path, int Ycolumns,int YoutCol,int colSize,int outputNum)//outputNum,设置为1,2选择输出列数据

{
    QFile file(path);

    if(!file.open(QFile::ReadOnly|QFile::Text)){
//        QMessageBox::warning(this,"Error","read file yangpin.txt default:%1".arg(file.errorString()));
        qDebug()<<"Error"<<endl;
    } //判断读取失败与否
  QString str;
  QTextStream in(&file);
  QList<int> xplot;//创建QList对象来存储对应列数据
  QList<int> yplot;
  int data_len;//检测输出数据个数用的
  int secChar=YoutCol*colSize;
int dis=colSize*(Ycolumns-YoutCol);
in.readLine();
in.readLine();//跳两行排除非数字,因为我所读txt前两行都存在非数字标注
  while(!in.atEnd()){
////    qDebug()<<in.readLine();
    str.append(in.readLine());

int len=str.length();
int first=0;
for(first;str[first]!=' ';first++)
    ;//得到第一个数据长度

int z=len-1-dis;
for(z;str[z]==' ';z--)
    ;//得到指定输出列数据长度,结合dis
//qDebug()<<first<<endl;
int a=(int)str.mid(0,first).toFloat(); //得到拉曼位移
int b=(int)str.mid(secChar,z-secChar).toFloat(); //得到指定列数的散射强度
xplot.append(a);
yplot.append(b); //获取x y坐标
//*series1<<QPointF(a,b);

//    qDebug()<<z<<","<<len<<endl;

//  qDebug()<<str<<endl;
//    qDebug()<<str.mid(0,6)<<", "<<str.mid(12,z-12)<<endl; //获取x坐标 y坐标

//      qDebug()<<str.mid(0,6)<<", "<<str.mid(12,z-12)<<endl; //获取x坐标 y坐标
      str.clear();//每列数据清空
    }

data_len=xplot.length();
qDebug()<<data_len<<endl;
//qDebug()<<xplot<<endl;
//qDebug()<<yplot<<endl;


if(in.atEnd()){
    qDebug()<<"End"<<endl;
    file.close();
}
    if(1==outputNum)
        return xplot;
    else if(2==outputNum)
        return yplot;
}


QList在大多数情况表现比较优秀。大家也可以去看一下QList、QVector等异同点。差不多就是这样了,结合了很多老铁的老帖。统一谢谢他们。完全是想回报一下。至少我没发现适用于光谱数据预处理的相关文章。哈哈。

int MainWindow::txtFormat(QString path,int chooseNum)
{
    QFile file(path);

    if(!file.open(QFile::ReadOnly|QFile::Text)){
//        QMessageBox::warning(this,"Error","read file yangpin.txt default:%1".arg(file.errorString()));
        qDebug()<<"Error"<<endl;
    } //判断读取失败与否
    QString temp;
    QString test;
    QTextStream in(&file);

    in.readLine();
    in.readLine();
    temp=in.readLine();

    int len=temp.length();
    int columnCnt=0;
    int sizeCol=0;
    for(int i=0;i<len;i++){
        if(temp[i]!=' '&&temp[i+1]==' ')
        columnCnt++;
    }
    for(int i=0;i<len;i++){
        sizeCol++;
        if(temp[i]==' '&&temp[i+1]!=' ')
            break;
    }
    test=QString::number(columnCnt-1);
    qDebug()<<"column number is"<<test<<endl;
    test=QString::number(sizeCol);
    qDebug()<<"columnSzie is"<<test<<endl;
if(0==columnCnt&&1==chooseNum)
    QMessageBox::warning(this,tr("Txt is empty"),tr("该记事本无可读数据,请重试"),QMessageBox::Yes);

    if(1==chooseNum)
        return columnCnt-1;//这里去除第一列
    else
        return sizeCol;
}

判断列数的主要原理就跟判断下降沿一样的思想。

对于我编程风格、基础等存在的问题,欢迎大家提意见。一定认真学习

沃兹基硕德-萌新原理