整体程序:
#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 *table = new QTableWidget(60,56); //新建一60行56列的表格
如果想要实现增加行,可以参考这篇文章,此处附上一个链接http://blog.csdn.net/xgbing/article/details/7774737
但问题是显示出来的表格太小,不知道是不是自己软件系统又抽什么疯了,所以我又调用了resize函数来调节表格大小。
table->resize(1366,200);
QDesktopWidget *d = QApplication::desktop();
int w = d->width(); // 返回桌面宽度
int h = d->height(); // 返回桌面高度
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