Qt数据库 QSqlQueryModel实例操作 下篇
创始人
2024-08-01 19:00:55
0

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

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

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

Qt数据库 QSqlQueryModel实例操作 下篇

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

  1. class MySqlQueryModel : public QSqlQueryModel  
  2. {  
  3. public:  
  4.     MySqlQueryModel();  
  5.     //下面三个函数都是虚函数,我们对其进行重载  
  6.     Qt::ItemFlags flags(const QModelIndex &index) const;  
  7.     bool setData(const QModelIndex &index, const QVariant &value, int role);  
  8.  
  9.     QVariant data(const QModelIndex &item, int role=Qt::DisplayRole) const;  
  10.     //  
  11. private:  
  12.     bool setName(int studentId, const QString &name);  
  13.     void refresh();  
  14. }; 

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

  1. #include “mysqlquerymodel.h”  
  2. #include  
  3. #include  
  4. MySqlQueryModel::MySqlQueryModel()  
  5. {  
  6. }  
  7.  
  8. Qt::ItemFlags MySqlQueryModel::flags(  
  9.         const QModelIndex &index) const //返回表格是否可更改的标志  
  10. {  
  11.     Qt::ItemFlags flags = QSqlQueryModel::flags(index);  
  12.     if (index.column() == 1) //第二个属性可更改  
  13.         flags |= Qt::ItemIsEditable;  
  14.     return flags;  
  15. }  
  16. bool MySqlQueryModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)  
  17.         //添加数据  
  18. {  
  19.     if (index.column() < 1 || index.column() > 2)  
  20.         return false;  
  21.     QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);  
  22.     int id = data(primaryKeyIndex).toInt(); //获取id号  
  23.     clear();  
  24.     bool ok;  
  25.     if (index.column() == 1) //第二个属性可更改  
  26.         ok = setName(id, value.toString());  
  27.  
  28.     refresh();  
  29.     return ok;  
  30. }  
  31. void MySqlQueryModel::refresh() //更新显示  
  32. {  
  33.     setQuery(“select * from student”);  
  34.     setHeaderData(0, Qt::Horizontal, QObject::tr(“id”));  
  35.     setHeaderData(1, Qt::Horizontal, QObject::tr(“name”));  
  36. }  
  37. bool MySqlQueryModel::setName(int studentId, const QString &name) //添加name属性的值  
  38. {  
  39.     QSqlQuery query;  
  40.     query.prepare(“update student set name = ? where id = ?”);  
  41.     query.addBindValue(name);  
  42.     query.addBindValue(studentId);  
  43.     return query.exec();  
  44. }  
  45. QVariant MySqlQueryModel::data(const QModelIndex &index, int role) const  
  46.         //更改数据显示样式  
  47. {  
  48.     QVariant value = QSqlQueryModel::data(index, role);  
  49.  
  50.     if (role == Qt::TextColorRole && index.column() == 0)  
  51.         return qVariantFromValue(QColor(Qt::red)); //***个属性的字体颜色为红色  
  52.     return value;  

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

然后更改函数如下:

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

运行效果如下:

Qt数据库 QSqlQueryModel实例操作 下篇

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

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

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...