Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)
文章目录
- 一、操作示例
- 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
- 因为是sql操作,所以需要在pro文件添加“QT += sql”;
- 虽然QSqlTableModel继承自QSqlQueryModel类,但其灵活性比QSqlQueryModel要多很多。
- QSqlTableModel能对数据进行操作,并且操作QSqlTableModel对象中的数据,将会对对应的数据表进行修改;
- 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数据库示例,含源码+注释)相关推荐
- Qt之天气预报——界面优化篇(含源码+注释)
一.界面优化效果 下方为界面优化完成和优化前的效果对比. 优化前: 优化后: 二.优化内容 添加标题栏 添加图片(图图标素材源自阿里巴巴矢量图标库) 更新UI内容(微调大小.布局比例) 添加鼠标事件函 ...
- Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)
文章目录 一.翻译程序示例图 二.流程须知(个人理解) 三.关于对话框中QDialogButtonBox翻译的操作 四.源码 CLinguistTest.h CLinguistTest.cpp CLi ...
- Qt+mpv制作windows/linux 下的动态壁纸软件(含源码)
mpv是啥? mpv之前是mediaplayer,windwos之前好像都有预装这个,都来经过发展,现在是一个对跨平台开发很友好的播放器工具. Qt是啥? 制作桌面应用程序的开发语言及工具,基于C++ ...
- 【飞机票售票系统】山东大学大二暑期数据库课程设计项目SSM+VUE2前后端分离(含源码)
一.系统概述 二.需求分析 2.1 系统功能分析 2.2 系统数据分析 2.3 系统非功能分析 三.系统设计 3.1 应用程序设计 3.2 数据库设计 3.2.1 概念设计 3.2.2 逻辑设计 四. ...
- Qt小游戏之数字华容道(百行代码搭雏形,可玩;含源码+注释)
文章目录 一.数字华容道,样图如下 二.废话少说直接上代码 1.首先是代码文件分析 2.CLabel的源码 3.CMainWindow的源码 4.main文件 总结 一.数字华容道,样图如下 相信大家 ...
- Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)
文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...
- shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)
shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)Shell脚本与MySQL数据库交互(增删改查)# 环境准备:安装mariadb 数据库 [root ...
- gorm存指针数据_gormt: gormt 是一个数据库映射工具,可以将 mysql 数据库自动生成 golang sturct 结构...
mysql数据库转 struct 工具,可以将mysql数据库自动生成golang sturct结构,带大驼峰命名规则.带json标签 交互界面模式 ./gormt -g=true 命令行模式 ./g ...
- mysql通过局域网访问数据库_MySQL数据库之局域网内访问同一个mysql数据库
本文主要向大家介绍了MySQL数据库之局域网内访问同一个mysql数据库 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 局域网内访问同一个mysql数据库. 一.运行cmd,输 ...
最新文章
- Hadoop何以快速成为最佳网络安全工具?
- MDB!= JMS,反之亦然
- c++代码好玩_一行Python代码能干嘛?快来看看吧!有表白利器哦
- 免插件为WordPress文章中标签添加内链
- Invoke-WebRequest Invoke-RestMethod 乱码研究
- android中listview的item滑动删除效果(已解决listview点击问题)
- excel工具栏隐藏了怎么办_Pixel Studio 像素软件教程之工具栏介绍
- colmap 稀疏重建输出的cameras.txt, images.txt,points3D.txt含义
- 计算机病毒制作教程,如何制作电脑病毒方法
- Cocos2d-x CocosBuilder使用教程(一)HelloCocosBuilder
- 使用全局优化方法识别中文事件因果关系
- worldwind 三维模型加载优化总结
- 北塔曾经很张狂 如今沉默为哪桩
- html做微信logo,HTML5新特性之用SVG绘制微信logo
- Arduino与Proteus仿真实例-MPX4250压力传感器驱动仿真
- 新冠病毒变异株核酸检测引物设计——代码实现1
- 智能温室系统来帮忙大棚管理
- 信息系统项目管理师(软考高级)知识总结(1)
- 《11.uboot的移植-从三星官方uboot开始移植》
- 图形类的实现(java)