QSqlRelationalTableModel 可以作为关系数据表的模型类,适用于三范式设计的表,主表中自动加载外键表中的名称。本文实现QSqlRelationalTableModel 为模型类,实现增删改查。
目录
0.表准备
关系图如下
1. 构建表格数据
声明变量
QSqlRelationalTableModel *tabModel;//数据库模型
QItemSelectionModel *selModel;//选择模型
SQLiteHelper dbHelper;
表格、数据模型、选择模型三板斧设置
//数据模型
tabModel = new QSqlRelationalTableModel(this);
tabModel->setTable("studInfo");
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
tabModel->setSort(tabModel->fieldIndex("studID"),Qt::AscendingOrder);
//选择模型
selModel = new QItemSelectionModel(tabModel,this);
connect(selModel,&QItemSelectionModel::currentRowChanged,this,&SqlRelationExample::do_currentChanged);
//表格控件
ui->tableView->setModel(tabModel);
ui->tableView->setSelectionModel(selModel);
列表的水平表头设置
//设置水平表头
tabModel->setHeaderData(tabModel->fieldIndex("studID"),Qt::Horizontal,"学号");
tabModel->setHeaderData(tabModel->fieldIndex("name"),Qt::Horizontal,"姓名");
tabModel->setHeaderData(tabModel->fieldIndex("gender"),Qt::Horizontal,"性别");
tabModel->setHeaderData(tabModel->fieldIndex("departID"),Qt::Horizontal,"学院");
tabModel->setHeaderData(tabModel->fieldIndex("majorID"),Qt::Horizontal,"专业");
设置表关系字段的映射关系
//设置代码字段的关系
tabModel->setRelation(tabModel->fieldIndex("departID"),QSqlRelation("departments","departID","department"));
tabModel->setRelation(tabModel->fieldIndex("majorID"),QSqlRelation("majors","majorID","major"));
//为关系型字段设置默认代理组件
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));
如上,QSqlRelation方法中三个变量依次为(表名,ID,显示名称)
执行查询
tabModel->select();
2. 新增一行
Append行
原理是在最后一行的位置插入一行
tabModel->insertRow(tabModel->rowCount(),QModelIndex());
QModelIndex curIndex = tabModel->index(tabModel->rowCount()-1,0);//最后一行,第一列
selModel->clearSelection();
selModel->setCurrentIndex(curIndex,QItemSelectionModel::Select);//设置当前行
Insert行
在指定的位置插入一行
QModelIndex curIndex = ui->tableView->currentIndex();
tabModel->insertRow(curIndex.row(),QModelIndex());
selModel->clearSelection();
selModel->setCurrentIndex(curIndex,QItemSelectionModel::Select);
3. 保存 & 撤销操作
保存
将做的修改,新增,插入等操作 ,全部提交
bool res = tabModel->submitAll();
if(!res)
QMessageBox::critical(this,"错误提示","数据保存错误:\n"+tabModel->lastError().text());
撤销
将做的修改,新增,插入等操作 ,全部撤销
tabModel->revertAll();
4.删除一行
tabModel->removeRow(selModel->currentIndex().row());
tabModel->submitAll();//提交修改
总结
使用QSqlRelationalTableModel ,来操作关系数据表的,增删改查,做好本表的字段与外键表的字段映射关系,通过该关系数据模型的submitAll()和revertAll()进行全部保存和全部撤销操作。
也可以自己创建代理类,来绑定字段。