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

整体程序:
#include "tablewidget.h" 
#include 
#include 
#include 
#include
#include 


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;			//225*355的图上坐标为(x,y)的点数据存储在第location行
double imageData[85425][33];			//(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();
	}

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

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

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

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"
			    	<<"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);但是这种做法会让我失去滚动条,另外介于比例好看的原因,我只取了它的宽度。
第三:把数组写进表格里

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




你可能感兴趣的:(Qt)