QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型

来源:互联网 发布:陕西用友软件 编辑:程序博客网 时间:2024/05/17 22:44

QSqlTableModel类继承至QSqlQueryModel类,该类提供了一个可读写单张SQL表的可编辑数据模型,功能:修改,插入,删除,查询,和排序

常用函数

QVariant headerData ( int section,Qt::Orientation orientation, int role = Qt::DisplayRole ) const  获取水平头或垂直头标题

bool setHeaderData ( int section,Qt::Orientation orientation, const QVariant & value, int role = Qt::EditRole ) 设置水平头或垂直头标题

int rowCount ( const QModelIndex & parent= QModelIndex() ) const // 返回行数

int columnCount ( const QModelIndex &index = QModelIndex() ) const // 返回列数

virtual bool removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() ) //model->removeColumns (0)删除第一列

bool QSqlTableModel::submitAll (),//提交所有被修改的数据,然后修改的数据被保存在数据库中

void QSqlTableModel::revertAll ()  //撤销所有的修改,如果数据库已经被提交了修改,就不能通过撤销修改改回来了

virtual void revertRow ( int row ) //恢复指定行的改变

void QSqlTableModel::setFilter ( const QString & filter )  //筛选,按照字符串filter对数据库进行筛选,相当于SQL中的WHERE语句

bool QSqlTableModel::select ()   //在筛选和排序的条件下,将数据库中符合要求的在mode表格中显示出来

void QSqlTableModel::setSort ( int column, Qt::SortOrder order ) //排序操作。按照列和Qt::SortOrder排序。Qt::SortOrder有升序和降序

bool insertRow ( int row, const QModelIndex & parent = QModelIndex() )  //插入行

bool insertColumn ( int column, constQModelIndex & parent = QModelIndex() ) // 插入列

model->setEditStrategy(QSqlTableModel::OnManualSubmit);   //设置保存策略为手动提交

 

一、在QTableView中显示数据库中表的数据

  1. QSqlTableModel *model = new QSqlTableModel(parentObject, database); // 摘抄自帮助文档  
  2. model->setTable("employee");  
  3. model->setEditStrategy(QSqlTableModel::OnManualSubmit);  
  4. model->select();  
  5. model->removeColumn(0); // don't show the ID  
  6. model->setHeaderData(0, Qt::Horizontal, tr("Name"));  
  7. model->setHeaderData(1, Qt::Horizontal, tr("Salary"));  
  8.   
  9. QTableView *view = new QTableView;  
  10. view->setModel(model);  
  11. view->show();  


二、修改QTableView中数据后的提交,加入事务处理

  1. model->database().transaction(); //开始事务操作  
  2. if (model->submitAll()) // 提交所有被修改的数据到数据库中  
  3. {  
  4.     model->database().commit(); //提交成功,事务将真正修改数据库数据  
  5. else {  
  6.     model->database().rollback(); //提交失败,事务回滚  
  7.     QMessageBox::warning(this, tr(“tableModel”),tr(“数据库错误: %1″).arg(model->lastError().text()));  
  8. }  
  9.     model->revertAll(); //撤销修改  

 

三、查询操作

相当于SQL语句:SELECT * FROM 表名 WHERE name = "name变量"

  1. model->setFilter(QObject::tr(“name = ‘%1′”).arg(name)); //根据姓名进行筛选  
  2. model->select(); //显示结果  
  3. for (int i = 0; i < model.rowCount(); ++i)  
  4. {  
  5.     QString name = model.record(i).value("name").toString();  
  6.     // ... 在此处理每一条的记录  
  7. }  
  8.   
  9. // 在操作大数据集时,建议通过索引指定字段  
  10. int primaryKeyIndex  = model.record().indexOf("id");  
  11. for (int i = 0; i < model.rowCount(); ++i)  
  12. {  
  13.     QSqlRecord record = model.record(i);  
  14.     QString name = record.value("name").toString();  
  15.     // ... 在此处理每一条的记录  
  16. }  


四、排序操作

  1. model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列,Qt::DescendingOrder为降序排序  
  2. model->select();  


五、插入操作

  1. int rowNum = model->rowCount(); //获得表的行数  
  2. int id = 最后一个ID+1;  
  3. model->insertRow(rowNum); //添加一行,或者用insertRows(0,1),在0行添加1条记录,根据表的排序规则,可能移到与指定行不同的行位置上  
  4. model->setData(model->index(rowNum,0),id);  //因为这里设置了ID为主键,所以必须给新行添加id属性值,id字段在第0列上  
  5. model->submitAll(); //可以直接提交  

 

六、删除一条记录

首先要定位到待删除的行上

  1. model.setFilter("id = 10");  
  2. model.select();  
  3. if (model.rowCount() == 1)  
  4. {  
  5.     model.removeRows(0,1) // 如果要删除所有满足条件的记录则把1改成model.rowCount()  
  6.     model.submitAll();  
  7. }  

 

在QTableView中删除选中的一行

  1. int curRow = tableView->currentIndex().row();  
  2. model->removeRow(curRow);   //删除一行  


在QTableView中删除选中的多行

QAbstractItemView::SelectionModeselectionMode()const // 原型

QModelIndexList QItemSelectionModel::selectedIndexes()const  //原型

  1. QItemSelectionModel *selections = tableView->selectionModel(); //返回当前的选择模式  
  2. QModelIndexList selecteds = selections->selectedIndexes(); //返回所有选定的模型项目索引列表  
  3. foreach (QModelIndex index, selecteds)  
  4. {  
  5.     int curRow = index.row(); //删除所有被选中的行  
  6.     model->removeRow(curRow);  
  7. }  
  8.   
  9. int ok = QMessageBox::warning(this,tr("删除选中的行!"),tr("你确定删除当前选取中的行吗?"),QMessageBox::Yes,QMessageBox::No);  
  10. if(ok == QMessageBox::Yes)  
  11. {  
  12.     model->submitAll(); //提交,在数据库中删除该行  
  13. else {  
  14.     model->revertAll(); //如果不删除,则撤销  
  15. }  



七、更新记录

必须先定位记录

  1. model.setFilter("id = 10");  
  2. model.select();  
  3. if (model.rowCount() == 1)  
  4. {  
  5.     model.setData(model.index(0,1),QObject::tr("小王"));  
  6.     model.submitAll();  
  7. }  


    可以看到这个模型很强大,而且完全脱离了SQL语句,就算你不怎么懂数据库,也可以利用它进行大部分常用的操作。这个模型提供了缓冲区,可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:

model->setEditStrategy(QSqlTableModel::OnManualSubmit);

OnManualSubmit表明我们要提交修改才能使其生效。可以先将修改保存起来,当我们执行提交函数时,再去真正地修改数据库。当然,这个模型比前面的模型更高级,前面讲的所有操作,在这里都能执行。





FROM:  http://blog.csdn.net/reborntercel/article/details/7000616

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃糖牙齿酸是怎么办 吃了甜食牙疼怎么办 吃甜的牙齿痛怎么办 吃糖了牙齿痛怎么办 马桶倒剩菜堵了怎么办 孕期喜欢吃甜的怎么办 1周岁了还没长牙怎么办 小孩十一个月还没长牙怎么办 吃羊肉上火牙疼怎么办 吃羊肉后上火了怎么办 羊肉吃多了上火怎么办 小孩吃糖牙齿坏怎么办 一岁宝宝吐奶怎么办 一个月宝宝吐奶怎么办 2个月里小孩好哭怎么办 两个月宝宝闹觉怎么办 6岁儿童视力0.5怎么办 单一的三系减少怎么办 血小板低到50该怎么办 放化疗后白细胞低怎么办 化疗后白细胞低发烧怎么办 全程c反应蛋白高怎么办 儿童c反应蛋白高怎么办 c反应蛋白高是怎么办 新生儿c反蛋白高怎么办 c反应蛋白高发烧怎么办 血沉高到50了怎么办啊 血沉和超敏偏高怎么办 孕37周血糖偏高怎么办 孕37周血糖7.0多怎么办 孕妇超敏crp偏高怎么办 高敏c反应蛋白高怎么办 孕17周尿蛋白高怎么办 血小板低到20该怎么办 血象高发烧39度怎么办 新生儿血象3万多怎么办 血象高发烧不退怎么办 半岁宝宝血象高怎么办 5-6小孩免疫力差怎么办 快速c反应蛋白高怎么办 15个月宝宝发烧怎么办