本文介绍的是Qt数据库 QSqlQueryModel实例操作 上篇,主要介绍QSqlQueryModel类的使用方法,先来看内容!

本文介绍的是Qt数据库 QSqlQueryModel实例操作 下篇,接着上篇文章继续介绍,Qt数据库 QSqlQueryModel实例操作 下篇 刚开始我们就讲到,这个模型默认是只读的,所以我们在窗口上并不能对表格中的内容进行修改。但是我们可以创建自己的模型,然后按照我们自己的意愿来显示数据和修改数据。要想使其可读写,需要自己的类继承自QSqlQueryModel,并且重写setData() 和 flags() 两个函数。如果我们要改变数据的显示,就要重写data() 函数。

下面的例子中我们让student表的id属性列显示红色,name属性列可编辑。

1.我们在工程中添加C++ Class,然后Class name设为MySqlQueryModel,Base Class设为QSqlQueryModel,如下:

Qt数据库 QSqlQueryModel实例操作 下篇(QSqlQueryModel)  Qt 数据库 QSqlQueryModel 第1张

2.我们将mysqlquerymodel.h中的内容更改如下:

  1. classMySqlQueryModel:publicQSqlQueryModel
  2. {
  3. public:
  4. MySqlQueryModel();
  5. //下面三个函数都是虚函数,我们对其进行重载
  6. Qt::ItemFlagsflags(constQModelIndex&index)const;
  7. boolsetData(constQModelIndex&index,constQVariant&value,introle);
  8. QVariantdata(constQModelIndex&item,introle=Qt::DisplayRole)const;
  9. //
  10. private:
  11. boolsetName(intstudentId,constQString&name);
  12. voidrefresh();
  13. };

然后将mysqlquerymodel.cpp文件更改如下:

  1. #include“mysqlquerymodel.h”
  2. #include<QSqlQuery>
  3. #include<QColor>
  4. MySqlQueryModel::MySqlQueryModel()
  5. {
  6. }
  7. Qt::ItemFlagsMySqlQueryModel::flags(
  8. constQModelIndex&index)const//返回表格是否可更改的标志
  9. {
  10. Qt::ItemFlagsflags=QSqlQueryModel::flags(index);
  11. if(index.column()==1)//第二个属性可更改
  12. flags|=Qt::ItemIsEditable;
  13. returnflags;
  14. }
  15. boolMySqlQueryModel::setData(constQModelIndex&index,constQVariant&value,int/*role*/)
  16. //添加数据
  17. {
  18. if(index.column()<1||index.column()>2)
  19. returnfalse;
  20. QModelIndexprimaryKeyIndex=QSqlQueryModel::index(index.row(),0);
  21. intid=data(primaryKeyIndex).toInt();//获取id号
  22. clear();
  23. boolok;
  24. if(index.column()==1)//第二个属性可更改
  25. ok=setName(id,value.toString());
  26. refresh();
  27. returnok;
  28. }
  29. voidMySqlQueryModel::refresh()//更新显示
  30. {
  31. setQuery(“select*fromstudent”);
  32. setHeaderData(0,Qt::Horizontal,QObject::tr(“id”));
  33. setHeaderData(1,Qt::Horizontal,QObject::tr(“name”));
  34. }
  35. boolMySqlQueryModel::setName(intstudentId,constQString&name)//添加name属性的值
  36. {
  37. QSqlQueryquery;
  38. query.prepare(“updatestudentsetname=?whereid=?”);
  39. query.addBindValue(name);
  40. query.addBindValue(studentId);
  41. returnquery.exec();
  42. }
  43. QVariantMySqlQueryModel::data(constQModelIndex&index,introle)const
  44. //更改数据显示样式
  45. {
  46. QVariantvalue=QSqlQueryModel::data(index,role);
  47. if(role==Qt::TextColorRole&&index.column()==0)
  48. returnqVariantFromValue(QColor(Qt::red));//***个属性的字体颜色为红色
  49. returnvalue;
  50. }

在widget.cpp文件中添加头文件:#include “mysqlquerymodel.h”

然后更改函数如下:

  1. voidWidget::on_pushButton_clicked()
  2. {
  3. QSqlQueryModel*model=newQSqlQueryModel;
  4. model->setQuery(“select*fromstudent”);
  5. model->setHeaderData(0,Qt::Horizontal,tr(“id”));
  6. model->setHeaderData(1,Qt::Horizontal,tr(“name”));
  7. QTableView*view=newQTableView;
  8. view->setModel(model);
  9. view->show();
  10. MySqlQueryModel*myModel=newMySqlQueryModel;//创建自己模型的对象
  11. myModel->setQuery(“select*fromstudent”);
  12. myModel->setHeaderData(0,Qt::Horizontal,tr(“id”));
  13. myModel->setHeaderData(1,Qt::Horizontal,tr(“name”));
  14. QTableView*view1=newQTableView;
  15. view1->setWindowTitle(“mySqlQueryModel”);//修改窗口标题
  16. view1->setModel(myModel);
  17. view1->show();
  18. }

运行效果如下:

Qt数据库 QSqlQueryModel实例操作 下篇(QSqlQueryModel)  Qt 数据库 QSqlQueryModel 第2张

可以看到我们要的效果已经出来了。本文章原创于www.yafeilinux.com

小结:Qt数据库 QSqlQueryModel实例操作 下篇的内容介绍完了,希望本文对你有所帮助,更多资料请参考编辑推荐!

转载请说明出处
知优网 » Qt数据库 QSqlQueryModel实例操作 下篇(QSqlQueryModel)

发表评论

您需要后才能发表评论