QSqlTableModel类为单个数据库表提供了一个可编辑的数据模型。QSqlTableModel是一个从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,并且可以用来提供数据给诸如QTableView的视图类(以查看数据)。
1.在表格中查看QSqlite数据库中的数据
例1:初始化实现一个表格;使用数据库中的哪个表格等信息在drawingTable中实现
//初始化
mdiArea = new QWidget;//mainwindow中的主widget
setCentralWidget(mdiArea);
tableview = new QTableView;
itemModel = new QStandardItemModel;
itemModel->setColumnCount(4);
layout = new QVBoxLayout(this);
layout->addWidget(tableview);
mdiArea->setLayout(layout);
drawingTable();
void MainWindow::drawingTable()
{
model = new QSqlTableModel(mdiArea);//基于主widget
model->setTable("student");//数据库中表的名字
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
bool isSelect = model->select();//选择整张表
tableview->setModel(model);//为表设置model
}
结果:
例2:
将数据库修改成GUI_主接线图
void MainWindow::drawingTable()
{
model = new QSqlTableModel(mdiArea);
//model->setTable("student");
model->setTable(tr("GUI_主接线图"));
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
bool isSelect = model->select();
tableview->setModel(model);
}
结果:
2.修改数据
在上述代码的基础上,添加一个按钮,按钮的槽函数实现如下:
void MainWindow::slt_modify()
{
bool istrans = model->database().transaction();//开始事务操作
if (!istrans)
{
return;
}
if (model->submitAll())//是否等待变化,提交到缓存
{
model->database().commit();//修改的数据提交数据库
}
else
{
model->database().rollback();//回滚
QMessageBox::warning(this,"tableModel","database error");
}
}
3.撤销修改
void MainWindow::slt_cancel()
{
model->revertAll();//取消缓存中更改数据
}
例子:将下图红框中的30改为80,然后按撤销,由80改回30。但是点击modify之后再点击cancel就不能取消了。这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略。
4.查询
添加一个按钮,用于查询符合条件的数据,其槽函数实现如下:
void MainWindow::slt_queryBtn()
{
QString queryStr = QObject::tr("time = '%1'").arg("2019-12-28 14:37:35.110");
model->setFilter(queryStr);
model->select();
}
点击query按钮的显示结果:
继续显示所有数据:
void MainWindow::slt_queryAllDataBtn()
{
model->setTable(tr("SOE记录"));
model->select();
}
5.排序
升序:
void MainWindow::slt_sortAscBtn()
{
model->setSort(0,Qt::AscendingOrder);//按id升序排列,0是第1列
model->select();
}
结果:
降序:槽函数
void MainWindow::slt_sortDesBtn()
{
model->setSort(0, Qt::DescendingOrder);//按id降序排列,0是第1列
model->select();
}
结果:
6.删除操作
槽函数实现如下:
void MainWindow::slt_delBtn()
{
int row = tableview->currentIndex().row();
model->removeRow(row);
int ok = QMessageBox::warning(this, tr("删除当前行!"), tr("确定删除当前行吗"),
QMessageBox::Yes, QMessageBox::No);
if (ok == QMessageBox::No)
{
model->revertAll(); //如果不删除,则撤销
}
else
{
model->submitAll(); //否则提交,在数据库中删除该行
}
}
结果:删除第5行
7.插入操作
槽函数实现如下:
void MainWindow::slt_insertBtn()
{
int rowNum = model->rowCount(); //获得表的行数
int id = 5;
model->insertRow(rowNum); //添加一行
model->setData(model->index(rowNum, 0), id);
model->submitAll(); //可以直接提交
}