您的位置:首页 > 编程语言 > Qt开发

Qt——读入txt文件,写入到表格

2014-11-21 13:35 393 查看
整体程序:
#include "tablewidget.h"
#include <QtWidgets>
#include <QFile>
#include <vector>
#include<iostream>
#include <fstream>

void readData()				//读入一张图的数据,将txt的二维数据传输到二维数组中
{
std::ifstream fin;
fin.open("Imagedata.txt");
if (fin.fail())
{
std::cout << "File open error!";
int m;
std::cin >> m;
}
else{
for (int i = 0; i < 85425; i++)
{
for (int j = 0; j < 33; j++){
fin >> imageData[i][j];

}
}
fin.close();
}

}

int x=1;
int y=20;			//原本三维数组(225,355,33)转换成(85425,33)的矩阵
int location = (x-1)*355+y;<span style="white-space:pre">			</span>//225*355的图上坐标为(x,y)的点数据存储在第location行
double imageData[85425][33];		<span style="white-space:pre">	</span>//(1,1)的点在第一行,(1,2)的点在第二行。。。(1,355)点在第355行,(2,1)点在第356行,以此类推

TableWidget::TableWidget()

{
table = new QTableWidget(this);
table->setColumnCount(56);
table->setRowCount(60);			//创建了一个60*56的表格

QStringList headers;
headers <<"400nm"<<"410nm"<<"420nm"<<"430nm"<<"440nm"<<"450nm"<<"460nm"<<"470nm"<<"480nm"<<"490nm"
<<"500nm"<<"510nm"<<"520nm"<<"530nm"<<"540nm"<<"550nm"<<"560nm"<<"570nm"<<"580nm"<<"590nm"
<<"600nm"<<"610nm"<<"620nm"<<"630nm"<<"640nm"<<"650nm"<<"660nm"<<"670nm"<<"680nm"<<"690nm"
<<"700nm"<<"710nm"<<"720nm"<<"730nm"<<"740nm"<<"750nm"<<"760nm"<<"770nm"<<"780nm"<<"790nm"
<<"800nm"<<"810nm"<<"820nm"<<"830nm"<<"840nm"<<"850nm"<<"860nm"<<"870nm"<<"880nm"<<"890nm"
<<"900nm"<<"910nm"<<"920nm"<<"930nm"<<"940nm"<<"950nm";
table->setHorizontalHeaderLabels(headers); //设置行标题,列标题不用设置,会自动排序

table->resize(1366,200);

readData();

for (int column = 0; column < 33; ++column)
{
QTableWidgetItem *item0;
item0 = new QTableWidgetItem;

double m=imageData[location][column];
QString txt = QString("%1").arg(m);  //把十进制数字转换成string型
item0->setText(txt);
table->setItem( 0 , column , item0);  //把txt内容填进表格里

}

}

接下来分别介绍:

第一:readData()函数,用于读取文件

void readData()
{
std::ifstream fin;
fin.open("Imagedata.txt");
if (fin.fail())
{
std::cout << "File open error!";
int m;
std::cin >> m;
}
else{
for (int i = 0; i < 85425; i++)
{
for (int j = 0; j < 33; j++){
fin >> imageData[i][j];

}
}
fin.close();
}

}
首先,肯定需要包含头文件 <fstream>和<iostream>,<iostream>负责输入输出,而<fstream>负责文件的读写,主要有如下三种函数

#include <fstream>
ofstream         //文件写操作 内存写入存储设备
ifstream         //文件读操作,存储设备读区到内存中
fstream          //读写操作,对打开的文件可进行读写操作
这方面的介绍很多,具体也可参考链接http://blog.csdn.net/kingstar158/article/details/6859379

第二:建立一个56*60的表格

<pre name="code" class="cpp">TableWidget::TableWidget()

{
table = new QTableWidget(this);
table->setColumnCount(56);
table->setRowCount(60);

QStringList headers;
headers <<"400nm"<<"410nm"<<"420nm"<<"430nm"<<"440nm"<<"450nm"<<"460nm"<<"470nm"<<"480nm"<<"490nm"
<span style="white-space:pre">	</span><<"500nm"<<"510nm"<<"520nm"<<"530nm"<<"540nm"<<"550nm"<<"560nm"<<"570nm"<<"580nm"<<"590nm"
<<"600nm"<<"610nm"<<"620nm"<<"630nm"<<"640nm"<<"650nm"<<"660nm"<<"670nm"<<"680nm"<<"690nm"
<<"700nm"<<"710nm"<<"720nm"<<"730nm"<<"740nm"<<"750nm"<<"760nm"<<"770nm"<<"780nm"<<"790nm"
<<"800nm"<<"810nm"<<"820nm"<<"830nm"<<"840nm"<<"850nm"<<"860nm"<<"870nm"<<"880nm"<<"890nm"
<<"900nm"<<"910nm"<<"920nm"<<"930nm"<<"940nm"<<"950nm";
table->setHorizontalHeaderLabels(headers); //设置行标题,列标题不用设置,会自动排序
}



创建一个QTableWidget的类,设置表格行列,与行标题。或者也可以这样创建表格

QTableWidget *table = new QTableWidget(60,56);  //新建一60行56列的表格


如果想要实现增加行,可以参考这篇文章,此处附上一个链接http://blog.csdn.net/xgbing/article/details/7774737

但问题是显示出来的表格太小,不知道是不是自己软件系统又抽什么疯了,所以我又调用了resize函数来调节表格大小。

table->resize(1366,200);


这里的1366是从哪儿得到的呢?我是查看了窗口的分辨率得知的,调用函数
QDesktopWidget *d = QApplication::desktop();
int w = d->width();     // 返回桌面宽度
int h = d->height();	// 返回桌面高度


我也曾试过直接让table->resize(w,h);但是这种做法会让我失去滚动条,另外介于比例好看的原因,我只取了它的宽度。
第三:把数组写进表格里

<pre name="code" class="cpp">for (int column = 0; column < 33; ++column)
{
QTableWidgetItem *item0;
item0 = new QTableWidgetItem;

double m=imageData[location][column];
QString txt = QString("%1").arg(m);  //把十进制的数字地转换成string型
item0->setText(txt);
table->setItem( 0 , column , item0);  //把txt内容填进表格里

}




也可以通过下面方式简单地在表格内输入内容

table->setItem(0, 0, new QTableWidgetItem(QString("1")));


Qstring只能输入字符串,所以需要把十进制数字转换成string型的才行,通过以下语句解决了这个问题。

QString txt = QString("%1").arg(m);
其中%1用第一个数字代替,%2就用第二个数字代替,简单来说就是用字符串变量参数依次替代字符串中最小数值,比如:

QString status = QString("Processing file %1 of %2: %3") .arg(i).arg(total).arg(fileName);


结果就是"Processing file i of totalt: fileName" 

再看arg的定义:QString::arg ( int a, int fieldWidth = 0, int
base = 10, const QChar & fillChar = QLatin1Char( ' ' ) ) const,这里fieldWidth表示字符宽度,base表示进制

相关知识主要参考这篇http://qimo601.iteye.com/blog/1420750
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: