实现对表格数据的插入删除、存取读取、排序的操作。
1.出现的错误
(1)Failed to start program. Path or permissions wrong
解决办法:去掉下图中的勾
(2)error: ‘class Ui::MyWidget’ has no member named ‘pushButton_3’
解决办法:检查控件名是否匹配以及头文件中是否加入该控件名。
2.table widget对以下两种情况读写单元格有限制
(1)insertRow(0)设置新值时
(2)读取新的insert位置时
解决办法:setitem手动输入产生item或设置新item位置
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem(QString(" ")));
3.排序函数
步骤:
(1)数据存入容器
QFile file("/root/test.dat");
file.open(QIODevice::WriteOnly);
int rowcount=ui->tableWidget->rowCount();//存行数
QByteArray ba;//定义一个字节序列
ba.resize(rowcount*sizeof(pppp)); //设置容量
pppp stu;
int i,j;
QString stuid,stuname;
QList<pppp> list;//定义容器list
for (i=0;i<rowcount;i++)
{
stuid= ui->tableWidget->item(i,0)->text();//获取值
stuname=ui->tableWidget->item(i,1)->text();
strcpy(stu.id,stuid.toStdString().data());//转字符数组
strcpy(stu.name,stuname.toStdString().data());
stu.score=ui->tableWidget->item(i,2)->text().toInt();
list<<stu;//数据存入容器
}
(2)qsort函数排序
qSort(list.begin(), list.end(), compareBarData);
for(i=0;i<rowcount;i++)
{
memcpy(ba.data()+i*sizeof(pppp),&list.at(i),sizeof(pppp));//拷贝
}
file.write(ba);
file.close();
(3)排序后数据重新装入表格
ui->tableWidget->selectAll();//选中所有单元格
on_pushButton_4_clicked();//删除所有值
file.open(QIODevice::ReadOnly);
ba=file.readAll();
pppp *per=(pppp*)ba.data();//读取新inser位置
for (j=0;j<ba.size()/sizeof(pppp);j++)
{
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString(" ")));
}
//读取item
for (j=0;j<ba.size()/sizeof(pppp);j++)
{
stuid=per->id;
stuname=per->name;
stuid=list.at(j).id;
stuname=list.at(j).name;
ui->tableWidget->item(j,0)->setText(stuid);//设置某行列的值
ui->tableWidget->item(j,1)->setText(stuname);
ui->tableWidget->item(j,2)->setText(QString::number(list.at(j).score));
per++;
}
file.close();
构造函数
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
typedef struct BarAmount {
char id[9];
char name[10];
int score;
}pppp;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tableWidget->setColumnCount(3);
QStringList headers;
headers << "id" << "name" << "score";
ui->tableWidget->setHorizontalHeaderLabels(headers);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()//read
{
ui->tableWidget->selectAll();
on_pushButton_4_clicked();
QFile file("/root/test.dat");
file.open(QIODevice::ReadOnly);
QByteArray ba;
ba=file.readAll();
int i;
pppp *per=(pppp*)ba.data();
for (i=0;i<ba.size()/sizeof(pppp);i++)
{
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString(" ")));
}
QString stuid;
QString stuname;
for (i=0;i<ba.size()/sizeof(pppp);i++)
{
//qDebug()<id;
stuid=per->id;
stuname=per->name;
ui->tableWidget->item(i,0)->setText(stuid);
ui->tableWidget->item(i,1)->setText(stuname);
ui->tableWidget->item(i,2)->setText(QString::number(per->score));
per++;
}
file.close();
}
void MainWindow::on_pushButton_2_clicked()//write
{
QFile file("/root/test.dat");
file.open(QIODevice::WriteOnly);
int rowcount=ui->tableWidget->rowCount();
QByteArray ba;
ba.resize(rowcount*sizeof(pppp));
pppp stu;
int i;
QString stuid;
QString stuname;
QList<pppp> list;
for (i=0;i<rowcount;i++)
{
stuid= ui->tableWidget->item(i,0)->text();
stuname=ui->tableWidget->item(i,1)->text();
strcpy(stu.id,stuid.toStdString().data());
strcpy(stu.name,stuname.toStdString().data());
stu.score=ui->tableWidget->item(i,2)->text().toInt();
list<<stu;
}
for(i=0;i<rowcount;i++)
{
//qDebug()<
memcpy(ba.data()+i*sizeof(pppp),&list.at(i),sizeof(pppp));
}
file.write(ba);
file.close();
}
void MainWindow::on_pushButton_3_clicked()//insert
{
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString("0")));
}
void MainWindow::on_pushButton_4_clicked()//delete
{
QList<QTableWidgetItem*> items=ui->tableWidget->selectedItems();
int i=0;
foreach (QTableWidgetItem* item,items)
{
i=i+1;
if(i%3==0){ui->tableWidget->removeRow(item->row());}
}
}
bool compareBarData(const BarAmount &barAmount1, const BarAmount &barAmount2)
{
return barAmount1.score > barAmount2.score;
}
void MainWindow::on_pushButton_5_clicked()//qsort
{
QFile file("/root/test.dat");
file.open(QIODevice::WriteOnly);
int rowcount=ui->tableWidget->rowCount();
QByteArray ba;
ba.resize(rowcount*sizeof(pppp));
pppp stu;
int i,j;
QString stuid,stuname;
QList<pppp> list;
for (i=0;i<rowcount;i++)
{
stuid= ui->tableWidget->item(i,0)->text();
stuname=ui->tableWidget->item(i,1)->text();
strcpy(stu.id,stuid.toStdString().data());
strcpy(stu.name,stuname.toStdString().data());
stu.score=ui->tableWidget->item(i,2)->text().toInt();
list<<stu;
}
qSort(list.begin(), list.end(), compareBarData);
for(i=0;i<rowcount;i++)
{
memcpy(ba.data()+i*sizeof(pppp),&list.at(i),sizeof(pppp));
}
file.write(ba);
file.close();
ui->tableWidget->selectAll();
on_pushButton_4_clicked();
file.open(QIODevice::ReadOnly);
ba=file.readAll();
pppp *per=(pppp*)ba.data();
for (j=0;j<ba.size()/sizeof(pppp);j++)
{
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString(" ")));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString(" ")));
}
//璇诲彇item
for (j=0;j<ba.size()/sizeof(pppp);j++)
{
stuid=per->id;
stuname=per->name;
stuid=list.at(j).id;
stuname=list.at(j).name;
ui->tableWidget->item(j,0)->setText(stuid);
ui->tableWidget->item(j,1)->setText(stuname);
ui->tableWidget->item(j,2)->setText(QString::number(list.at(j).score));
per++;
}
file.close();
}
学习总结:
1.容器类常用QList aaa定义,,需要#include ,其中aaa为变量名,常用方法,T为数据类型
2.Qt容器类指容纳特定类型对象的集合,常见的容器类有:QVector、QList、QLinkList、QStack、QQueue、QMap
3.Qt常用的序列操作函数可供容器类使用:
qFill:使用一个特定值对[begin,end]范围内元素进行赋值
qCopy:将[begin1,end1]元素复制到[begin2,end2]中
qSort:排序
(1)整数排序
QList<int> list;
list << 33 << 12 << 68 << 6 << 12;
qSort(list.begin(), list.end());
int i;
for(i=0;i<list.length();i++)
qDebug()<<list.at(i);
(2)字符串排序
bool caseInsensitiveLessThan(const QString &s1, const QString &s2)
{
return s1.toLower() < s2.toLower();
}//如果用头文件声明会出错,头文件里不需声明
void MainWindow::on_pushButton_clicked()
{
QStringList list;
list << "AlPha" << "beTA" << "gamma" << "DELTA";
qSort(list.begin(), list.end(), caseInsensitiveLessThan);
int i;
for(i=0;i<list.length();i++)
qDebug()<<list.at(i);
}
(3)结构体排序
Cpp文件开头定义结构体
typedef struct BarAmount {
char id[9];
char name[10];
int score;
}pppp;
bool compareBarData(const BarAmount &barAmount1, const BarAmount &barAmount2)
{
return barAmount1.score1 > barAmount2.score;
}
void MainWindow::on_pushButton_clicked()
{
QFile file("/root/test.dat");
file.open(QIODevice::WriteOnly);
int rowcount=ui->tableWidget->rowCount();
QByteArray ba;
ba.resize(rowcount*sizeof(pppp));
pppp stu;
int i,j;
QString stuid,stuname;
QList<pppp> list;
for (i=0;i<rowcount;i++)
{
stuid= ui->tableWidget->item(i,0)->text(); stuname=ui->tableWidget->item(i,1)->text();
strcpy(stu.id,stuid.toStdString().data());
strcpy(stu.name,stuname.toStdString().data());
stu.score=ui->tableWidget->item(i,2)->text().toInt();
list<<stu;
qSort(list.begin(), list.end(), compareBarData);
int i;
for(i=0;i<list.length();i++)
qDebug()<<list.at(i).diameter;
}
qFind:查找
qBinaryFind:指定范围内查找,存在返回位置,不存在返回end