嵌入式学习笔记3——表格操作

实现对表格数据的插入删除、存取读取、排序的操作。
1.出现的错误
(1)Failed to start program. Path or permissions wrong
解决办法:去掉下图中的勾
嵌入式学习笔记3——表格操作_第1张图片
(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、QHash
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

你可能感兴趣的:(嵌入式学习笔记3——表格操作)