SQL的模型类

news2025/1/10 18:15:02

在Qt的数据库中,除了QSqlQuery访问数据库,还可以使用QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel,这三个类是从QAbstractTableModel派生下来的,可以很直观的查看数据库的数据

  • QSqlQueryModel   提供一个只读模型
  • QSqlTableModel     提供一个可以浏览和修改独立的SQL表
  • QSqlRelationalTableModel  是QSqlTableModel的拓展,提供了对外键的支持

QSqlQueryModel的使用 

因为继承自QAbstractTableModel,QSqlQueryModel拥有很多QAbstractTableModel的函数,这里就不在列举。

注意:QSqlQueryModel创建的是一个只读模型

 QSqlQueryModel常用的函数:

setQuery()设置SQL语句
record()返回包含有关当前查询的字段的信息的记录
query()返回当前SQL语句
lastError()返回有关数据库上发生的最后一个错误的信息
clear()清除模型并释放资源

还有其他函数,可以自行查看帮助文档。

    QSqlQueryModel *model=new QSqlQueryModel(this);
    model->setQuery("select * from Person");//设置SQL语句
    model->setHeaderData(0,Qt::Horizontal,tr("学号"));
    model->setHeaderData(1,Qt::Horizontal,tr("名字"));
    model->setHeaderData(2,Qt::Horizontal,tr("电话"));
    model->setHeaderData(3,Qt::Horizontal,tr("年龄"));
    model->setHeaderData(4,Qt::Horizontal,tr("身高"));
    QTableView *view=new QTableView(this);//创建一个视图
    view->setFixedSize(800,800);//设置视图大小
    view->setModel(model);//添加模型

 

QSqlTableModel

QSqlTableModel 是一个高级接口,用于从单个表中读取和写入数据库记录。它建立在较低级别的QSqlQuery之上,可用于为QTableView等视图类提供数据。

注意该模型默认可读/写:需要设置只读的话,在视图中设置

View->setEditTriggers(QAbstractItemView::NoEditTriggers);

常用的函数:

tableName()返回当前选定表的名称
setSort()排序
setRecord()应用于模型中的
setTable(name)将模型操作的数据库表设置为 name
setFilter设置筛选器,筛选器是一个不带关键字的 SQL 子句
setEditStrategy()设置编辑数据库中的值的策略
setData()将角色角色的项索引的数据设置为
selectStatement()返回内部用于填充模型的 SQL 语句。该语句包括筛选器和子句。SELECTORDER BY
revertRow()返回指定行的所有更改
removeRow()删除从开始的计数行。由于此模型不支持分层结构,因此父模型必须是无效的模型索引
removeColumns()模型中删除计数列,从索引开始
record()返回模型中行的记录。
primaryKey()返回主键
insertRecord()在位置处插入记录。如果为负数,则记录将追加到末尾
headData()标头
data()返回指定角色的值
select()以数据填充模型,使用指定的过滤器和排序条件,使用通过 setTable() 设置的表中的数据填充模型,如果成功则true,否则返回 false, 调用 select() 将还原任何未提交的更改并删除任何插入的列。
submit()当用户停止编辑当前行时,项目委托将调用此重新实现的槽
submitAll()提交所有挂起的更改,并在成功时返回
revert()当用户取消编辑当前行时,项目委托将调用此重新实现的槽
revertAll()还原所有挂起的更改

QSqlTableModel::EditStrategy(策略)

QSqlTableModel::OnFieldChange对模型的所有更改将立即应用于数据库
QSqlTableModel::OnRowChange当用户选择其他行时,将应用对行的更改
QSqlTableModel::OnManualSubmit所有更改都将缓存在模型中,直到调用 submitAll() 或 revertAll()

 QSqlTableModel访问数据库的方式有两种:

  1. 使用模型和视图
  2. 直接使用编程的方式直接访问,而无需将其绑定到视图

使用模型和视图:

    QSqlTableModel *model=new QSqlTableModel(this);
    model->setTable("Person");//设置访问的表
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置策略
    model->select();
    model->setHeaderData(0,Qt::Horizontal,tr("学号"));
    model->setHeaderData(1,Qt::Horizontal,tr("名字"));
    model->setHeaderData(2,Qt::Horizontal,tr("电话"));
    model->setHeaderData(3,Qt::Horizontal,tr("年龄"));
    model->setHeaderData(4,Qt::Horizontal,tr("身高"));
    QTableView *view=new QTableView(this);
    view->setFixedSize(800,800);
    view->setModel(model);
    view->show();

使用使用编程的方式直接访问:

    QSqlTableModel model;
    model.setTable("Person");
    model.select();
    for(int i=0;i<model.rowCount();i++)
    {
        QSqlRecord p=model.record(i);
        for(int j=0;j<p.count();j++)
        {
            qDebug()<<p.value(j);
        }

    }

 一些函数的使用:

1.使用排序

    QSqlTableModel *model=new QSqlTableModel(this);
    model->setTable("Person");//设置访问的表
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置策略
    model->select();
    model->setHeaderData(0,Qt::Horizontal,tr("学号"));
    model->setHeaderData(1,Qt::Horizontal,tr("名字"));
    model->setHeaderData(2,Qt::Horizontal,tr("电话"));
    model->setHeaderData(3,Qt::Horizontal,tr("年龄"));
    model->setHeaderData(4,Qt::Horizontal,tr("身高"));

    model->setSort(0,Qt::DescendingOrder);//按照第一列进行降序排序
    model->select();//重新显示数据

    QTableView *view=new QTableView(this);
    view->setFixedSize(800,800);
    view->setModel(model);
    view->show();

2.使用筛选

    QSqlTableModel *model=new QSqlTableModel(this);
    model->setTable("Person");//设置访问的表
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置策略
    model->select();
    model->setHeaderData(0,Qt::Horizontal,tr("学号"));
    model->setHeaderData(1,Qt::Horizontal,tr("名字"));
    model->setHeaderData(2,Qt::Horizontal,tr("电话"));
    model->setHeaderData(3,Qt::Horizontal,tr("年龄"));
    model->setHeaderData(4,Qt::Horizontal,tr("身高"));

    model->setFilter(QString("name='%1'").arg("李"));//筛选 名字为 李的数据
    model->select();
    
    QTableView *view=new QTableView(this);
    view->setFixedSize(800,800);
    view->setModel(model);
    view->show();

在ui->界面中添加3个按钮,分别为保存更改,撤销更改,删除选中行

函数的实现

    connect(ui->pushButton,&QPushButton::clicked,this,[=]()//保存更改
    {
        model->submitAll();//保存
        //这里的话可以使用事务,但这里就不举例了
    });
    connect(ui->pushButton_2,&QPushButton::clicked,this,[=]()//撤销更改
    {
        model->revertAll();//撤销
    });
    connect(ui->pushButton_3,&QPushButton::clicked,this,[=]()//删除选中行
    {
        int row=view->currentIndex().row();//获取当前行数
        model->removeRow(row);//删除当前行
        model->submitAll();//保存
    });

初始状态:

 修改数据并保存:

撤销就不演示了

删除选中行:选中最后一行,点击删除

还有很多函数,这里就不介绍了,可以自行测试和使用。 

QSqlRelationalTableModel

QSqlRelationalTableModel继承自QSqlTableModel,提供了对外键的支持

常用函数:

relation()返回列的关系
relationMode()返回一个 QSqlTableModel 对象,用于访问列是其外键的表,或者如果给定没有关系
select()以数据填充模型
removeColumns()移除列
setData()将具有指定索引的项目中角色的数据设置为给定的值
setJoinMode()设置 SQL 联接模式以显示或隐藏具有 NULL 外键的行
setRelation()允许指定的关系指定的外部索引
setTable()设置表

setRelation(int column, const QSqlRelation &relation) 用于两个表之间创建一个关系

    QSqlRelationalTableModel *model=new QSqlRelationalTableModel(this);
    model->setTable("Person");
    model->setRelation(0,QSqlRelation("People","name","age"));
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置策略
    model->select();
    QTableView *view=new QTableView(this);
    view->setModel(model);

model->setRelation(0,QSqlRelation("People","name","age"));

  • 0为列数
  • People 为相关联的表
  • name为外键
  • age为在0列显示的People中的数据

在Qt中还提供一个委托类,会使用一个QComBoBox来显示数据库中该类的数据,使得方便修改数据 。

代码如下:

view->setItemDelegate(new QSqlRelationDelegate(view));

       

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Educational Codeforces Round 98 (Rated for Div. 2) D. Radio Towers

翻译&#xff1a; 坐标线上有&#x1d45b;2个城镇&#xff0c;编号从0到&#x1d45b;1。&#x1d456;-th镇位于&#x1d456;点。 你在城镇1、2、…、&#x1d45b;以12的概率建造一个无线电塔(这些事件是独立的)。之后&#xff0c;您希望将每个塔上的信号功率设置为从1到…

C/C++开发工具CLion v2022.3全新发布——支持C++ 20

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的&#xff0c;包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C&#xff0c;同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

C++ 当基类为抽象类时如何析构派生类

前言&#xff1a;本教程不涉及基础&#xff0c;稍微了解一下Cvirtual多态的知识就可以了&#xff0c;不了解的话可以先去看一下菜鸟教程&#xff0c;也可以看我往期的文章《virtual》、《虚函数表》 多态分为静态多态和动态多态 静态多态&#xff1a;也成为编译时的多态&#…

使用Word模板导出Word后,表格后面产生空白页

目录 背景 解决 参考 背景 项目中有导出Word功能,其实现逻辑是先整理一个Word文档,里面使用占位符;代码读取Word文档,然后替换占位符。 但出现这样的问题:填充某个表格后,表格后面出现了空白页。 解决 调查发现是段落标记导致的,如何显示段落标记?File -> Op…

生成对抗:DCGAN

DCGAN简介 Generative Adversarial Networks(GANs),GANs有两个模型组成,一个是生成器,用于训练生成假的数据,另一个是判别器,用于预测生成器的输出结果。其中生成器提供训练数据给判别器&#xff0c;提高判别器的准确率。判别器提供生成样本的预测结果&#xff0c;给生成器提供…

【Java系列】小小练习——带你回顾Java基本运算符

返回主篇章         &#x1f447; 【Java】才疏学浅小石Java问道之路 Java小练习1. 练习一1.1 题目1.2 题解(附解析)2. 练习二2.1 题目2.2 题解(附解析)3. 练习三3.1 题目3.2 题解(附解析)小结1. 练习一 1.1 题目 一个三位数&#xff0c;将其拆分为个位、十位、百位后…

mac安装cocoapods完整步骤

一、概念理解 首先不要急着搜索终端命令&#xff0c;你需要明白安装 cocoapods 都需要什么环境&#xff0c;这对于安装途中如果遇到问题该如何解决很重要&#xff0c;很重要&#xff0c;很重要&#xff01; 1、安装pods需要依赖 ruby 环境&#xff0c;而安装 ruby 你需要借助工…

[网鼎杯 2020 白虎组]PicDown(任意文件读取)

打开界面发现有一个get传参然后&#xff0c;尝试任意文件读取漏洞&#xff0c;/etc/passwd看一下,提示下载了一个jpg图片然后 打不开只能用 010查看一下信息 看来是猜对了&#xff0c;然后 如果日记没删掉可以查看历史记录 .bash_history呃呃呃差不到&#xff0c;那就看一下现…

Python 现代控制理论 —— 梯度下降法实现的线性回归系统

线性回归是有监督学习中的经典问题&#xff0c;其核心在于找到样本的多个特征与标签值之间的线性关系。样本集中的第j个样本可被表示为&#xff1a; 特征向量&#xff1a;标签值&#xff1a; 而线性回归系统给出权重向量&#xff1a; 使得该样本的预测值为&#xff1a; 当所有…

Python采集某网站m3u8内容,美女我来了~

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 环境使用: Python 3.8 Pycharm 模块使用: import requests >>> pip install requests import re 正则表达式 解析数据 import json 安装python第三方模块: win R 输入 cmd 点击确…

不止一面的百变 ACE

这个时代&#xff0c;可谓是云原生的黄金时代。 站在这个云原生的风口&#xff0c;年轻一代的开发者如何看待自己所处的环境&#xff1f;他们眼中的云原生未来是什么样&#xff1f; 今天我们就将走近一位年轻的“云原生原住民”&#xff0c;听听他作为开发者的成长经历。 War…

【python3】9.python高阶内容(上)_基础

9.python高阶内容&#xff08;上&#xff09;_基础 2022.12.27 python高阶内容&#xff08;上&#xff09;_基础9.1 字符串的高阶玩法 9.1.1 %百分号模式 %d:整数%i:整数%s:字符%f:小数 【方式1】&#xff1a;前面用格式占位&#xff0c;后面用具体的内容 name "莫烦…

Android设计模式详解之访问者模式

前言 访问者模式是一种将数据操作与数据结构分离的设计模式&#xff1b; 定义&#xff1a;封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作&#xff1b; 使用场景&#xff1a; 对象结构比较稳定&a…

大厂与小厂招人的区别,看完多少有点不敢相信

前两天在头条发了一条招人的感慨&#xff0c;关于大厂招人和小公司招人的区别。 大厂&#xff1a;有影响力&#xff0c;有钱&#xff0c;能够吸引了大量的应聘者。因此&#xff0c;也就有了筛选的资格&#xff0c;比如必须985名校毕业&#xff0c;必须35岁以下&#xff0c;不能…

基于DoIP使用CANoe对ECU进行诊断测试

伴随以太网引入到车载网络中,本文分享通过常用工具CANoe怎么样对ECU进行通信以及测试。 相比在车载CAN总线,以太网又有什么与众不同之处? 1、硬件接口卡(收发器) 以往车载CAN网络较常使用的是VN 16XX 系列,在连接ECU进行通信时,除了配置波特率也要进行通道分配: 而…

7个学习UI、UX设计一定要经历的步骤

我们不是一些有才华的设计师。我们天生就有艺术天赋。后天我们学会了设计技巧。设计的根本目的是解决问题。设计是不断发现和解决问题。 有许多设计领域&#xff1a;UI、UX.产品设计师.平面设计师.交互设计师.信息架构师等&#xff0c;所以要找出你最感兴趣的设计专业。 现在让…

美颜sdk动态贴纸技术、代码分析

目前&#xff0c;美颜sdk动态贴纸已经成了各大直播平台主播的必备“直播伴侣”&#xff0c;在其他的视频拍摄场景动态贴纸的热度同样很高&#xff0c;本篇文章小编将为大家深度盘点一下美颜sdk动态贴纸的技术实现以及代码。 一、多终端适配 对于如今的直播平台终端来说&#x…

CAPL学习之路-测试功能集函数(测试结构化)

用户可以使用如下函数在测试报告中对每一条测试用例设置结构化的输出内容 TestCaseDescription 添加测试用例的描述文本 此函数用于测试用例中,描述文本会添加在固定区域(测试用例title的下方)。多次调用该函数,描述文本会合并显示在固定区域。如果想让描述文本换行,可以…

爆火的Web3.0背后,百度营销如何抓住流量密码?

出品| 大力财经 文 | 魏力 AI、元宇宙、Web3.0、AIGC等新技术、新概念的加持&#xff0c;给传统的流量营销平台带来了前所未有的挑战。尤其是短视频时代的崛起&#xff0c;用户的使用习惯开始改变&#xff0c;完全改变了流量的逻辑和习惯。 从搜索引擎业务起家的百度&#x…

DoIP---车载以太网诊断方面边缘节点的路由策略分析

假期后开工第一天&#xff0c;规划好自己一天需要做的事情&#xff0c;按部就班完成每日任务&#xff0c;做好每日总结。 自己一天一个脚印&#xff0c;这不是鸡血&#xff0c;这是工作态度&#xff01;&#xff01;&#xff01; 惯例分享一段喜欢的文字&#xff1a; 每个人…