文章目录

  • 一、操作示例
    • 1.1 修改记录(数据)
    • 1.2 添加记录(数据)
    • 1.3 删除记录(数据)
    • 1.4 取消操作
    • 1.5 排序操作
    • 1.6 查询操作
  • 二、了解QSqlTableModel
  • 三、源码
    • 3.1 CSqlTest.h
    • 3.2 CSqlTest.cpp
  • 总结
  • 相关文章

一、操作示例

1.1 修改记录(数据)

下图含手动更新记录和自动更新记录时的记录修改操作,其中前十秒是自动更新记录的操作,后十秒为手动更新记录的操作(当非自动保存时,不点击保存按钮就不会保存)。

1.2 添加记录(数据)

下图为添加记录的操作,新添加的记录行的行标题是‘*’符号,并且当更新策略为手动更新时,需要手动保存记录。

1.3 删除记录(数据)

下图为删除记录的操作,删除后行的行标题变为‘!’,并且删除操作不区分自动/手动提交记录,无论怎样都是自动提交。

1.4 取消操作

下图为取消操作,点击取消按钮后,之前修改/添加的数据将会恢复到最开始的样子(除了删除操作)。

1.5 排序操作

下图为排序操作,分别演示了id(字符类型)和age(数值类型)的排序效果。

1.6 查询操作

下图为查询操作,演示了查询id为001 和 name“小王”的信息,以及当前文本为“查询字段”时,点击查询则清空查询条件,

提示:示例图中开始都先刷新了数据表,表明数据为最新数据;源码在本文第三节(源码含详细注释);不会使用Qt设计师设计界面的小伙伴点击这里。

二、了解QSqlTableModel

  1. 因为是sql操作,所以需要在pro文件添加“QT += sql”;
  2. 虽然QSqlTableModel继承自QSqlQueryModel类,但其灵活性比QSqlQueryModel要多很多。
  3. QSqlTableModel能对数据进行操作,并且操作QSqlTableModel对象中的数据,将会对对应的数据表进行修改;
  4. QSqlTableModel具有识别字段类型的功能,从而提供不同的代理控件(如示例图中的年龄和身高控件为spinBox控件)。

三、源码

提示:源码中的槽函数都是通过ui文件的转到槽功能添加,所有没有连接信号槽的代码

3.1 CSqlTest.h

#ifndef CSQLTEST_H
#define CSQLTEST_H#include <QMainWindow>
#include <QSqlTableModel>namespace Ui {class CSqlTest;
}class CSqlTest : public QMainWindow
{Q_OBJECTpublic:explicit CSqlTest(QWidget *parent = 0);~CSqlTest();private slots:void on_addBt_clicked();    //添加void on_deleteBt_clicked(); //删除void on_saveBt_clicked();   //保存(手动保存数据时可用)void on_cancelBt_clicked(); //取消(手动保存数据时可用)void on_autoSaveCheckBox_clicked(bool checked); //是否自动保存数据的复选框void on_tableView_clicked(const QModelIndex &index);    //获取当前点击行号的槽函数void on_sortFunction(); //排序槽函数void on_findBt_clicked();   //查询槽函数private:Ui::CSqlTest *ui;QSqlTableModel  *m_pModel;      //数据模型对象QSqlDatabase    m_db;           //数据库对象int             m_lastClickRow; //最后点击行的行号变量
};#endif // CSQLTEST_H

3.2 CSqlTest.cpp

#include "CSqlTest.h"
#include "ui_CSqlTest.h"#include <QDebug>
#include <QSqlError>CSqlTest::CSqlTest(QWidget *parent): QMainWindow(parent), ui(new Ui::CSqlTest), m_lastClickRow(0)
{ui->setupUi(this);this->setWindowTitle("QSqlTableModel测试");//连接排序的信号槽connect(ui->sortComboBox, &QComboBox::currentTextChanged, this, &CSqlTest::on_sortFunction);connect(ui->ascRadioButton, &QRadioButton::clicked, this, &CSqlTest::on_sortFunction);connect(ui->descRadioButton, &QRadioButton::clicked, this, &CSqlTest::on_sortFunction);//-----------------------连接数据库-----------------------//指定数据库类型m_db = QSqlDatabase::addDatabase("QMYSQL");//设置主机名、用户名、密码、端口号等信息(若是使用SQLite数据库这些信息无需设置,仅指定数据库名即可)m_db.setHostName("127.0.0.1");m_db.setUserName("root");m_db.setPassword("123456");m_db.setPort(3306);//指定数据库名m_db.setDatabaseName("test");if(!m_db.open()){qDebug() << "打开数据库失败!" << m_db.lastError().text();return;}//-----------------------QSqlTableModel-----------------------//为数据模型设置父对象、数据库对象m_pModel = new QSqlTableModel(this, m_db);//指定数据源表m_pModel->setTable("StudentsInfo");//指定排序字段及排序方式m_pModel->setSort(0, Qt::AscendingOrder);//设置数据更新模式(行/列某值更新时hi立即更新到数据库)//! QSqlTableModel::OnFieldChange 字段值变化时立即更新到数据库中//! QSqlTableModel::OnRowChange 当前行变化时才将修改值更新到数据库中//! QSqlTableModel::OnManualSubmit 修改是数据暂存,需要手动提交m_pModel->setEditStrategy(QSqlTableModel::OnFieldChange);if(!m_pModel->select()){qDebug() << "数据查询失败!!" << m_pModel->lastError().text();return;}//设置数据模型指定列的列标题(若是不设置,则标题为和数据表上一样)m_pModel->setHeaderData(0, Qt::Horizontal, "学号");m_pModel->setHeaderData(1, Qt::Horizontal, "姓名");m_pModel->setHeaderData(2, Qt::Horizontal, "年龄");m_pModel->setHeaderData(3, Qt::Horizontal, "身高");//将数据模型设置到tableView控件上ui->tableView->setModel(m_pModel);}CSqlTest::~CSqlTest()
{delete ui;
}void CSqlTest::on_addBt_clicked()
{//无名字时将不能添加if(ui->nameEdit->text().isEmpty())return;//添加新行到m_lastClickRow值的位置m_pModel->insertRow(m_lastClickRow);//计算、获取新建记录上的值并设置QString sid =  QString("%1").arg(m_pModel->rowCount(), 3, 10, QLatin1Char('0'));m_pModel->setData(m_pModel->index(m_lastClickRow, 0), sid);m_pModel->setData(m_pModel->index(m_lastClickRow, 1), ui->nameEdit->text());m_pModel->setData(m_pModel->index(m_lastClickRow, 2), ui->ageSpinBox->text());m_pModel->setData(m_pModel->index(m_lastClickRow, 3), ui->heightSpinBox->text());
}void CSqlTest::on_deleteBt_clicked()
{//没有记录时,将不能删除if(m_pModel->rowCount() == 0)return;//移除最后点击的行m_pModel->removeRow(m_lastClickRow);//将指定的行设置为0m_lastClickRow = 0;
}void CSqlTest::on_saveBt_clicked()
{//调用提交函数(相当于更新所有修改的值)m_pModel->submitAll();
}void CSqlTest::on_cancelBt_clicked()
{//取消所有未保存的修改m_pModel->revertAll();
}void CSqlTest::on_autoSaveCheckBox_clicked(bool checked)
{//设置保存、取消按钮是否可用ui->saveBt->setEnabled(!checked);ui->cancelBt->setEnabled(!checked);//设置数据模型的编辑策略if(checked){//字段更新立即更新数据m_pModel->setEditStrategy(QSqlTableModel::OnFieldChange);}else{//手动更新数据m_pModel->setEditStrategy(QSqlTableModel::OnManualSubmit);}
}void CSqlTest::on_tableView_clicked(const QModelIndex &index)
{//将最后点击的行赋值至变量中m_lastClickRow = index.row();
}void CSqlTest::on_sortFunction()
{//判断当前是否指定字段,未指定则返回if(0 == ui->sortComboBox->currentIndex())return;//! 获取是升序还是降序(因为升序/降序按钮是单选按钮,所以判断一个即可)//! 因为升序/降序类型为Qt::SortOrder,所以用该类型变量存放即可Qt::SortOrder sortFlag = ui->ascRadioButton->isChecked()? Qt::AscendingOrder: Qt::DescendingOrder;//! 设置排序字段和排序方式//! 因为0被提示字符占用,所以获取到的index需要减1m_pModel->setSort(ui->sortComboBox->currentIndex() - 1, sortFlag);//重新获取数据使排序生效m_pModel->select();
}void CSqlTest::on_findBt_clicked()
{//判断当前是否指定字段,未指定则将筛选设为空if(0 == ui->findComboBox->currentIndex()){m_pModel->setFilter("");return;}//筛选操作会自动刷新,无需再调用select()QString field = ui->findComboBox->currentText();QString val = ui->findValEdit->text();m_pModel->setFilter(QString("%1 = '%2'").arg(field).arg(val));
}

总结

QSqlTableModel是一个为单个数据库表提供可编辑的数据模型;因为其能对数据表进行修改,所以在使用时需要小心,避免数据误删。刚开始学习Qt的小伙伴可以尝试使用该类做一个数据库管理工具出来。
昨天在QSqlQuery、QSqlQueryModel的简单使用中提了一下二者结合的情况,其实QSqlTableModel就类似二者结合后的产物叭。
源码没有进行详细的测试,还有不少的BUG,有兴趣的小伙伴可用试着修复并完善其功能(其实是博主太懒了,哈哈哈)。

相关文章

Qt数据库练习之Qt SQLITE的使用(从无到有,含源码+注释)
Qt数据库练习之QSqlQuery、QSqlQueryModel的简单使用(含源码+注释)
Qt数据库练习之QSqlRelationalTableModel的使用(MySql数据库示例,含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)相关推荐

  1. Qt之天气预报——界面优化篇(含源码+注释)

    一.界面优化效果 下方为界面优化完成和优化前的效果对比. 优化前: 优化后: 二.优化内容 添加标题栏 添加图片(图图标素材源自阿里巴巴矢量图标库) 更新UI内容(微调大小.布局比例) 添加鼠标事件函 ...

  2. Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)

    文章目录 一.翻译程序示例图 二.流程须知(个人理解) 三.关于对话框中QDialogButtonBox翻译的操作 四.源码 CLinguistTest.h CLinguistTest.cpp CLi ...

  3. Qt+mpv制作windows/linux 下的动态壁纸软件(含源码)

    mpv是啥? mpv之前是mediaplayer,windwos之前好像都有预装这个,都来经过发展,现在是一个对跨平台开发很友好的播放器工具. Qt是啥? 制作桌面应用程序的开发语言及工具,基于C++ ...

  4. 【飞机票售票系统】山东大学大二暑期数据库课程设计项目SSM+VUE2前后端分离(含源码)

    一.系统概述 二.需求分析 2.1 系统功能分析 2.2 系统数据分析 2.3 系统非功能分析 三.系统设计 3.1 应用程序设计 3.2 数据库设计 3.2.1 概念设计 3.2.2 逻辑设计 四. ...

  5. Qt小游戏之数字华容道(百行代码搭雏形,可玩;含源码+注释)

    文章目录 一.数字华容道,样图如下 二.废话少说直接上代码 1.首先是代码文件分析 2.CLabel的源码 3.CMainWindow的源码 4.main文件 总结 一.数字华容道,样图如下 相信大家 ...

  6. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)

    文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...

  7. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)Shell脚本与MySQL数据库交互(增删改查)# 环境准备:安装mariadb 数据库 [root ...

  8. gorm存指针数据_gormt: gormt 是一个数据库映射工具,可以将 mysql 数据库自动生成 golang sturct 结构...

    mysql数据库转 struct 工具,可以将mysql数据库自动生成golang sturct结构,带大驼峰命名规则.带json标签 交互界面模式 ./gormt -g=true 命令行模式 ./g ...

  9. mysql通过局域网访问数据库_MySQL数据库之局域网内访问同一个mysql数据库

    本文主要向大家介绍了MySQL数据库之局域网内访问同一个mysql数据库 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 局域网内访问同一个mysql数据库. 一.运行cmd,输 ...

最新文章

  1. Hadoop何以快速成为最佳网络安全工具?
  2. MDB!= JMS,反之亦然
  3. c++代码好玩_一行Python代码能干嘛?快来看看吧!有表白利器哦
  4. 免插件为WordPress文章中标签添加内链
  5. Invoke-WebRequest Invoke-RestMethod 乱码研究
  6. android中listview的item滑动删除效果(已解决listview点击问题)
  7. excel工具栏隐藏了怎么办_Pixel Studio 像素软件教程之工具栏介绍
  8. colmap 稀疏重建输出的cameras.txt, images.txt,points3D.txt含义
  9. 计算机病毒制作教程,如何制作电脑病毒方法
  10. Cocos2d-x CocosBuilder使用教程(一)HelloCocosBuilder
  11. 使用全局优化方法识别中文事件因果关系
  12. worldwind 三维模型加载优化总结
  13. 北塔曾经很张狂 如今沉默为哪桩
  14. html做微信logo,HTML5新特性之用SVG绘制微信logo
  15. Arduino与Proteus仿真实例-MPX4250压力传感器驱动仿真
  16. 新冠病毒变异株核酸检测引物设计——代码实现1
  17. 智能温室系统来帮忙大棚管理
  18. 信息系统项目管理师(软考高级)知识总结(1)
  19. 《11.uboot的移植-从三星官方uboot开始移植》
  20. 图形类的实现(java)

热门文章

  1. PSO粒子群优化算法
  2. 黑猴子的家:Ubuntu18.04.2 安装 ktouch 打字软件
  3. Flutter集成字节跳动穿山甲广告
  4. python turtle绘图 中小学课堂教学 绘制一幅风景 太阳云朵 树
  5. vue2+vxtable实现复杂可编辑表格
  6. Python 制作马赛克拼合图像
  7. php 查询成绩_与专家讨论PHP: 成绩单
  8. 01-量化投资平台配置
  9. 导航编程用c语言还是c加加,C语言/C加加大神程序员老司机带你玩转C语言指针详解...
  10. SQL Server发布订阅配置及实例讲解