本文介绍的是Qt数据库 QSqlQueryModel实例操作 上篇,主要介绍QSqlQueryModel类的使用方法,先来看内容!
本文介绍的是Qt数据库 QSqlQueryModel实例操作 下篇,接着上篇文章继续介绍,Qt数据库 QSqlQueryModel实例操作 下篇 刚开始我们就讲到,这个模型默认是只读的,所以我们在窗口上并不能对表格中的内容进行修改。但是我们可以创建自己的模型,然后按照我们自己的意愿来显示数据和修改数据。要想使其可读写,需要自己的类继承自QSqlQueryModel,并且重写setData() 和 flags() 两个函数。如果我们要改变数据的显示,就要重写data() 函数。
下面的例子中我们让student表的id属性列显示红色,name属性列可编辑。
1.我们在工程中添加C++ Class,然后Class name设为MySqlQueryModel,Base Class设为QSqlQueryModel,如下:
2.我们将mysqlquerymodel.h中的内容更改如下:
- classMySqlQueryModel:publicQSqlQueryModel
- {
- public:
- MySqlQueryModel();
- //下面三个函数都是虚函数,我们对其进行重载
- Qt::ItemFlagsflags(constQModelIndex&index)const;
- boolsetData(constQModelIndex&index,constQVariant&value,introle);
- QVariantdata(constQModelIndex&item,introle=Qt::DisplayRole)const;
- //
- private:
- boolsetName(intstudentId,constQString&name);
- voidrefresh();
- };
然后将mysqlquerymodel.cpp文件更改如下:
- #include“mysqlquerymodel.h”
- #include<QSqlQuery>
- #include<QColor>
- MySqlQueryModel::MySqlQueryModel()
- {
- }
- Qt::ItemFlagsMySqlQueryModel::flags(
- constQModelIndex&index)const//返回表格是否可更改的标志
- {
- Qt::ItemFlagsflags=QSqlQueryModel::flags(index);
- if(index.column()==1)//第二个属性可更改
- flags|=Qt::ItemIsEditable;
- returnflags;
- }
- boolMySqlQueryModel::setData(constQModelIndex&index,constQVariant&value,int/*role*/)
- //添加数据
- {
- if(index.column()<1||index.column()>2)
- returnfalse;
- QModelIndexprimaryKeyIndex=QSqlQueryModel::index(index.row(),0);
- intid=data(primaryKeyIndex).toInt();//获取id号
- clear();
- boolok;
- if(index.column()==1)//第二个属性可更改
- ok=setName(id,value.toString());
- refresh();
- returnok;
- }
- voidMySqlQueryModel::refresh()//更新显示
- {
- setQuery(“select*fromstudent”);
- setHeaderData(0,Qt::Horizontal,QObject::tr(“id”));
- setHeaderData(1,Qt::Horizontal,QObject::tr(“name”));
- }
- boolMySqlQueryModel::setName(intstudentId,constQString&name)//添加name属性的值
- {
- QSqlQueryquery;
- query.prepare(“updatestudentsetname=?whereid=?”);
- query.addBindValue(name);
- query.addBindValue(studentId);
- returnquery.exec();
- }
- QVariantMySqlQueryModel::data(constQModelIndex&index,introle)const
- //更改数据显示样式
- {
- QVariantvalue=QSqlQueryModel::data(index,role);
- if(role==Qt::TextColorRole&&index.column()==0)
- returnqVariantFromValue(QColor(Qt::red));//***个属性的字体颜色为红色
- returnvalue;
- }
在widget.cpp文件中添加头文件:#include “mysqlquerymodel.h”
然后更改函数如下:
- voidWidget::on_pushButton_clicked()
- {
- QSqlQueryModel*model=newQSqlQueryModel;
- model->setQuery(“select*fromstudent”);
- model->setHeaderData(0,Qt::Horizontal,tr(“id”));
- model->setHeaderData(1,Qt::Horizontal,tr(“name”));
- QTableView*view=newQTableView;
- view->setModel(model);
- view->show();
- MySqlQueryModel*myModel=newMySqlQueryModel;//创建自己模型的对象
- myModel->setQuery(“select*fromstudent”);
- myModel->setHeaderData(0,Qt::Horizontal,tr(“id”));
- myModel->setHeaderData(1,Qt::Horizontal,tr(“name”));
- QTableView*view1=newQTableView;
- view1->setWindowTitle(“mySqlQueryModel”);//修改窗口标题
- view1->setModel(myModel);
- view1->show();
- }
运行效果如下:
可以看到我们要的效果已经出来了。本文章原创于www.yafeilinux.com
小结:Qt数据库 QSqlQueryModel实例操作 下篇的内容介绍完了,希望本文对你有所帮助,更多资料请参考编辑推荐!