本文主要讲述使用Qt,读取CSV并载入到表格控件中。
CSV表格,是数据使用逗号(,)分隔,以呈现出一个表格形式。形式简单,那么操作起来就比较简单了。
上图,可以看出每行每个数据使用逗号(,)隔开。那么无论怎么去操作,其实就是找到逗号(,)的编码(一般是ACSII码)以分别前后数据。不同的行,那就是换行符的,不过很多函数都是直接有处理的。如果是学习的话,使用C语言一类,需要自己处理的就多一些,这样比直接调用做好的方法更适合学习。直接使用做好的方法函数,自然就是比较快捷的。
下面就是开始介绍博主遇到的与这一步的相关的工作内容以及实现。
本部分功能主要实现,读取CSV文件中的数据,并以表格的形式呈现,其实会根据进行其它处理,在本篇文件中,仅讲诉一部分,也算作再一次学习吧
void DataWork::dataProcessing(QString fileName)
{
qDebug() << "receive the execute signal---------------------------------";
qDebug() << " current thread ID:" << QThread::currentThreadId();
QVector<double> data;
QStringList dataType;
readCSVFile(fileName, data, dataType);
// 发送结束信号
qDebug() << " finish the work and sent the resultReady signal\n";
emit dataProcessingEnd(data, dataType);
}
上面的这一段代码是共有槽函数,与主界面的信号连接。这个数据处理类,会使用其它线程运行,可以避免主界面“卡死”的情况。
readCSVFile函数操作读取的实际过程,读取结束后,通过信号将数据传输给主线程。
void readCSVFile(QString fileName,QVector<double>& data, QStringList& dataType);
fileName需要读取的文件路径,data为存放double的QVector的容器,dataType是数据所代表的类型。
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "open file failed!" << '\n';
return;
}
QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
process_line(line);
}
上面这第一段代码,使用Qt中的QFile类操作文件,这里文件类比较完善,操作相对简单。
第二段代码,是Qt帮助文档中示例,以示例为参照,简单讲一下。
QFile::QFile(const QString &name)
Constructs a new file object to represent the file with the given name.
示例中,QFile构造里面填入相对地址,构造一个file对象来表示给定的文件,接下来只需要操作这个file对象就相当于对文件操作。
首先,使用open函数打开对应的文件,必须判断是否成功,需要打开文件不是百分百成功的(比较常见的原因有:文件已经被其它程序占用;命令过程中被打断等等)。文件若失败则直接返回结束,成功则继续执行对文件的各类操作。
The QTextStream class provides a convenient interface for reading and writing text.
创建QTextStream类对文件进行读写操作,
bool QTextStream::atEnd() const
Returns true if there is no more data to be read from the QTextStream; otherwise returns false. This is similar to, but not the same as calling QIODevice::atEnd(), as QTextStream also takes into account its internal Unicode buffer.
使用atEnd方法判断是否还未读的数据,若没有更多的数据了则返回true。我们操作时,还有数据则接着读取则需要进行取反,保证while循环接着执行。
可以看到readLine方法,返回值是QString类型,而不是一个个数据,那么就需要进行再一步的处理了。当然前人已经把树载好了,那我们只乘凉,等有时间再栽树吧。
使用QStringList对象就可以拿到一个一个的数据了。
temp = line.split(",");
for (int i = 0; i < tempSize; i++) {
data.append(temp[i].toDouble());
count++;
}
将从文件读取到数据,放入到容器当中,最后使用信号将准备好的数据和拿到的数据类型传输给主线程,然后进一步地载入表格之中。
表格可以使用QTableWidget,setItem方法。
/*****************************分割线***************************/
工作中总会有问题,一点点解决。