QSqlRelationalTableModel 可以作为关系数据表的模型类,适用于三范式设计的表,主表中自动加载外键表中的名称。本文实现QSqlRelationalTableModel 为模型类,实现增删改查。
目录
0.表准备
1. 构建表格数据
声明变量
表格、数据模型、选择模型三板斧设置
列表的水平表头设置
设置表关系字段的映射关系
执行查询
2. 新增一行
Append行
Insert行
3. 保存 & 撤销操作
保存
撤销
4.删除一行
总结
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()进行全部保存和全部撤销操作。
也可以自己创建代理类,来绑定字段。