QSqlTableModel 操作探究

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(); //可以直接提交  
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值