前言

本文主要利用QSqlTableModel+QTableView来实现直接在QTableView中进行对数据库数据的操作
新增:点击新增按钮之后,光标直接移到最后一行,然后双击进行表内容的填充。
删除:选中一行之后,点击删除。
修改:选中一行,点击修改,此时表内容可修改。
提交:将进行的操作提交到数据库操作。
取消:取消操作。

QSqlTableModel

简易用法:

	// QSqlTableModel(QObject*, QSqlDatabase)
m_sqlModel = new QSqlTableModel(this, m_access->m_sqlDatabase); // setTable -> tableName 就是你要查询的表名
m_sqlModel->setTable("tableName"); // 设置为手动刷新,用来达到需要手动提交的效果
m_sqlModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

新增

新增的主要逻辑是fetchMore到最后一行,然后再最后一行处添加一行空的数据,然后将表格设置为可编辑状态,然后再双击进行编辑

void ThresholdManage::on_btnNew_clicked()
{
// 设置编辑模式
// m_editMode是自定义变量,用于标识当前是否是编辑状态
m_editMode = true; // 将其余功能按键禁用,将提交和取消启用
ui->btnEdit->setDisabled(true);
ui->btnNew->setDisabled(true);
ui->btnDelete->setDisabled(true);
ui->btnCancel->setEnabled(true);
ui->btnSubmit->setEnabled(true); // m_sqlModel每次只能最大缓存256个,所以需要先fetchMore
// 否则会导致移动到最后一行时,只会最多移到256行
while (m_sqlModel->canFetchMore()) {
m_sqlModel->fetchMore();
} int rowCount = m_sqlModel->rowCount(); // 在rowCount处添加一行
m_sqlModel->insertRow(rowCount); m_sqlModel->setData(m_sqlModel->index(rowCount, 0), ""); // 设置双击编辑
ui->tableView->setEditTriggers(QTableView::DoubleClicked); // 滚动到底部
ui->tableView->scrollToBottom(); }

删除

删除是直接removeRow,删除当前选中行,然后submitAll

void ThresholdManage::on_btnDelete_clicked()
{
// 找到当前行,然后removeRow
auto index = ui->tableView->currentIndex();
m_sqlModel->removeRow(index.row()); // 删除前,弹框确认
int ok = QMessageBox::warning(this, "删除当前行!", "确定删除当前行?", QMessageBox::Yes, QMessageBox::No); if (ok == QMessageBox::No) {
m_sqlModel->revertAll();
return;
} // 提交
m_sqlModel->submitAll();
// 查询
m_sqlModel->select();
}

修改

修改是将表格的编辑模式打开

void ThresholdManage::on_btnEdit_clicked()
{
// TODO
// 将其余按键状态置灰 m_editMode = true; // 将表格的编辑模式打开
ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked); ui->btnNew->setDisabled(true);
ui->btnNew->setDisabled(true);
ui->btnDelete->setDisabled(true);
ui->btnCancel->setEnabled(true);
ui->btnSubmit->setEnabled(true); }

提交

提交是submitAll

void ThresholdManage::on_btnSubmit_clicked()
{
// TODO
// 刷新表格的内容
m_editMode = false; // 提交弹框确认
int ok = QMessageBox::warning(this, "提交修改", "确定提交修改?", QMessageBox::Yes, QMessageBox::No); if (ok == QMessageBox::No) {
qDebug() << "取消提交";
return;
} // 提交修改
m_sqlModel->submitAll(); ui->btnNew->setEnabled(true);
ui->btnEdit->setEnabled(true);
ui->btnDelete->setEnabled(true);
ui->btnCancel->setDisabled(true);
ui->btnSubmit->setDisabled(true); // 将表格置为不可修改
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

取消

取消是revertAll

void ThresholdManage::on_btnCancel_clicked()
{
// TODO
// 刷新表格的内容
m_editMode = false; // 取消所有
m_sqlModel->revertAll(); ui->btnNew->setEnabled(true);
ui->btnEdit->setEnabled(true);
ui->btnDelete->setEnabled(true);
ui->btnCancel->setDisabled(true);
ui->btnSubmit->setDisabled(true); ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

代码如下:资源

刚刚发现这个资源我上传的时候我设置的不需要积分,但是后台自动给我加了积分…可以访问这个下载

QTableView实现在表格内直接对数据库内容进行修改、新增和删除等操作的更多相关文章

  1. C#使用Command将dataGrideView表格内数据与数据库交互

    本文主要介绍通过Command类使用SQL插入指令insert与查询指令select将dataGrideView表格内添加至数据库,与从数据库读出数据存放在dataGrideView表格中. C#制作 ...

  2. 怎么把excel表格内的数据导入数据库?

    第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...

  3. Qt QTableView 表格内添加控件

    目录 Qt QTableView 表格内添加控件 1. QItemDelegate 2. setIndexWidget 3. setIndexWidget + setLayout Qt QTableV ...

  4. jsp+oracle实现数据库内容以表格形式在前台显示(包含分页)

    jsp+oracle实现数据库内容以表格形式在前台显示(包含分页) 在文件夹内新增list_emp.jsp 代码如下: <%@ page contentType="text/html& ...

  5. Linqpad使用(调试Linq、结合linq调试业务场景、表格内编辑数据)

      linqpad是一款linq语句调试工具,功能如下: 1.直接执行linq语句并查看生成的原生sql语句 2.可结合linq+C#代码进行业务场景调试 3.表格内直接新增.修改.删除数据 4.直接 ...

  6. 如何将Excl内数据导入数据库?

    最近有个Excl表格内的数据需要导入SQL Server数据库内,使用SQL Server Management Studio客户端图形界面操作了一番,步骤还挺多,感觉有必要分享给大家一下,顺便自己也 ...

  7. Latex 表格内公式换行方法

    Latex 表格内的公式实现换行的方法       简单的两步走:   1.先将下面的语句放在latex正文的导言区: \newcommand{\tabincell}[2]{\begin{tabula ...

  8. 外网访问内网MariaDB数据库

    外网访问本地MariaDB数据库 本地安装了MariaDB数据库,只能在局域网内访问,怎样从公网也能访问内网MariaDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Mar ...

  9. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  10. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

随机推荐

  1. Python+Selenium自动搜索基金业协会指定企业名单,爬虫抓取指定信息并保存到数据库

    Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库.网址https://gs.amac.org.cn/amac-infodisc/res/pof/manager/ ...

  2. Qt/C++编写全能播放组件(支持ffmpeg2/3/4/5/6/Qt4/5/6)

    一.前言 从代码层面以及自由度来说,用ffmpeg来写全能播放组件是最佳方案(跨平台最好最多.编解码能力最强),尽管已经有优秀的vlc/mpv等方案可以直接用,但是vlc/mpv对标主要是播放器应用层 ...

  3. 鸿蒙OS高级技巧:打造个性化动态Swiper效果

    前言 在鸿蒙OS的广阔天地中,开发者们有机会创造出令人惊叹的用户体验.最近,我着手设计一款具有独特滑动效果的Swiper组件,它在滑动时能够迅速进入视野,同时巧妙地将旧的cell隐藏到视线之外.本文将 ...

  4. 做一个windos服务和api搭配,获取电脑的mac地址

    创建webapi项目,只是搭配服务用,什么三层mvc都不弄了,默认的模板直接用就好. 简单分析下,采用signalr通信来传递mac地址,所以先安装个signalr的包(如果简单操作的话可以不装最新的 ...

  5. Intellij IDEA开发环境中Springboot项目无Run ****main()的菜单

    问题描述: Intellij  IDEA开发环境中Springboot项目无Run ****main()的菜单. 解决办法有以下几种: 方法1:Idea无右键run选项, 无法通过main方法启动sp ...

  6. 开源即时通讯IM框架MobileIMSDK的微信小程序端技术概览

    一.基本介绍 MobileIMSDK - 微信小程序端是一套基于微信原生 WebSocket 的即时通讯库: 1)超轻量级.无任何第 3 方库依赖(开箱即用): 2)纯 JS 编写.ES6 语法.高度 ...

  7. 分析基于ASP.NET Core Kernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下的性能表现

    分析基于ASP.NET Core Kernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下的性能表现 使用默认的 gRPC 项目模板创建,垃圾回收器类型为 ServerGC(Serve ...

  8. 将 EasySQLite 从 .NET 8 升级到 .NET 9

    前言 EasySQLite是一个.NET 8操作SQLite入门到实战的详细教程,主要是对学校班级,学生信息进行管理维护.今天咱们的主要内容是将EasySQLite从.NET 8升级到.NET 9. ...

  9. UWP Shadow 阴影

    参考文字: https://mtaulty.com/2016/08/10/windows-10-uwp-and-composition-light-and-shade/ <Grid Backgr ...

  10. runoob-PostgreSQL 教程

    https://www.runoob.com/postgresql/postgresql-tutorial.html