00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 开发环境
  • 03. QSqlRelationalTableModel外键
  • 04. QSqlRelationalDelegate委托类
  • 05. 数据库模型总结
  • 06. 附录

01. 概述

QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个字段和其他表中的主键字段之间的一对一的映射。例如,student表中的course字段对应的是course表中的id字段,那么就称字段course是一个外键。因为这里的course字段的值是一些数字,这样的显示很不友好,使用关系表格模型,就可以将它显示为course表中的name字段的值。

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. QSqlRelationalTableModel外键

本示例在【Qt】数据库实战之QSqlTableModel模型示例上面修改

3.1 connection.h文件修改如下

#ifndef CONNECTION_H
#define CONNECTION_H#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>static bool createConnection()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (!db.open()){return false;}QSqlQuery query;query.exec("create table student(id int primary key, name varchar(20), course int)");query.exec("insert into student values(1, ' 王鹏', 1)");query.exec("insert into student values(2, '李刚', 1)");query.exec("insert into student values(3, '李强', 2)");query.exec("insert into student values(4, '王强', 2)");query.exec("insert into student values(5, '黎明朗', 2)");query.exec("create table course(id int primary key, name varchar(20), teacher varchar(20))");query.exec("insert into course values(1, 'Math', '邓明')");query.exec("insert into course values(2, 'English', '邓海')");query.exec("insert into course values(3, 'Computer', '李丽')");return true;
}#endif // CONNECTION_H

建立了两个表,student表中有一字段是course,它是int型的,而course表的主键也是int型的。如果要将course字段和course表进行关联,它们的类型就必须相同。

3.2 更改main.cpp文件

#include "mainwindow.h"#include <QApplication>
#include "connection.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()){return 1;}MainWindow w;w.show();return a.exec();
}

3.3 mainwindow.h文件中添加头文件和私有成员

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSqlRelationalTableModel>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:private:Ui::MainWindow *ui;QSqlRelationalTableModel *model;
};
#endif // MAINWINDOW_H

3.4 在UI界面设计上添加一个TableView

3.5 mainwindow.cpp文件中,在构造函数里添加如下代码

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);model = new QSqlRelationalTableModel(this);//字段变化时写入数据库model->setEditStrategy(QSqlTableModel::OnFieldChange);model->setTable("student");//将student表的第三个字段设为course表id字段的外建//显示course表的name字段的值model->setRelation(2, QSqlRelation("course", "id", "name"));model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));model->setHeaderData(2, Qt::Horizontal, tr("Course"));model->select();ui->tableView->setModel(model);
}

这里修改了model的提交策略,OnFieldChange表示只要字段被改动就马上写入数据库,这样就不需要我们再执行提交函数了。setRelation()函数实现了创建外键。

3.6 程序执行结果如下图所示

可以看到Course字段已经不再是编号,而是具体的课程名称了。外键说简单点就是将两个相关的表建立一个桥梁,让它们关联起来。

04. QSqlRelationalDelegate委托类

有时我们也希望,如果用户更改课程字段,那么只能在课程表中已有的课程中进行选择,而不能随意填写课程。Qt中还提供了一个QSqlRelationalDelegate委托类,它可以为QSqlRelationalTableModel显示和编辑数据。这个委托为一个外键提供了一个QComboBox部件来显示所有可选的数据,这样就显得更加人性化了。使用这个委托很简单,我们先在mainwindow.cpp文件中添加头文件:

在构造函数最后添加一下代码:

    //设置使用委托ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));

执行结果如下:

05. 数据库模型总结

我们可以根据自己的需要来选择使用对应的模型。如果熟悉SQL语法,又不需要将所有的数据都显示出来,那么只需要使用QSqlQuery就可以了。对于QSqlTableModel,它主要是用来显示一个单独的表格,而QSqlQueryModel可以用来显示任意一个结果集,如果想显示任意一个结果集,而且想使其可读写,那么建议子类化QSqlQueryModel,然后重新实现flags()和setData()函数。

06. 附录

6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639

6.2 示例程序下载
网址:【Qt】数据库实战之QSqlRelationalTableModel.rar

【Qt】数据库实战之QSqlRelationalTableModel相关推荐

  1. Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

    文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...

  2. 【Qt】数据库实战之QSqlQueryModel

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlQueryModel查询模型 04. QSqlQueryModel常用操作 05. QSqlQueryModel自 ...

  3. 【Qt】数据库实战之QSqlTableModel模型

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlTableModel基本操作 04. QSqlTableModel修改操作 05. QSqlTableModel查 ...

  4. 【Qt】数据库实战(三)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 增删改查操作 04. 名字绑定和位置绑定 05. 程序示例 06. 批处理操作 07. 事务操作 08. 附录 01. 概 ...

  5. 【Qt】数据库实战(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...

  6. 【Qt】数据库实战(一)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 数据库驱动 04. 创建数据库连接 05. 数据库简单操作 06. 附录 01. 概述 Qt中的Qt SQL模块提供了对数 ...

  7. 深入浅出Qt数据库编程:从基本操作到高级技巧

    深入浅出Qt数据库编程:从基本操作到高级技巧 (Demystifying Qt Database Programming: From Basic Operations to Advanced Tech ...

  8. Qt数据库操作(三) -- 使用SQL模型类

    文章目录 Qt数据库操作(三) -- 使用SQL模型类 1.SQL查询模型 2.SQL表格模型 3.关系表格模型 Qt数据库操作(三) – 使用SQL模型类 Qt 提供了3个高级的类来访问数据库,分别 ...

  9. Qt项目实战:MP3音乐播放器

    音乐播放器逻辑   首先通过打开文件,获取文件夹下mp3文件的名字,将其存入QTableWidget控件下,通过双击QTableWidget空间中的内容,播放相应的mp3音乐文件,同时通过使用QMed ...

最新文章

  1. 一种PacBio测序数据组装得到的基因组序列的纠错方法
  2. 如何检查你的友情链接是否还在?
  3. 动态添加html元素
  4. Spark调优——你工作中的首选
  5. JAVA操作Excel表格
  6. 2019牛客多校第四场 B xor (线性基求交)
  7. Java 8 Stream中间操作(方法)示例
  8. 【lua学习】6.函数,闭包,错误处理
  9. leetcode —— 24. 两两交换链表中的节点
  10. 【docker】docker 实现 的基础
  11. C++_类和对象_对象特性_友元_成员函数做友元---C++语言工作笔记054
  12. 官方配置要求_电脑配置不够玩赛博朋克?租电脑一个月只要百来元就能玩!
  13. Spark源码系列(一)spark-submit提交作业过程
  14. 《空间谱估计理论与算法》学习笔记001-绪论
  15. 浅述Docker的容器编排
  16. 微信小程序推荐大全100个
  17. 老式马桶水封不足的唯一解决方案
  18. react native (Error: Unable To Find Utility “Instruments“, Not A Developer Tool)
  19. 2022年深圳技能大赛-大数据技术应用职业技能竞赛介绍
  20. redission看门狗实现机制一看就懂

热门文章

  1. 调用cmd不显示黑框的方法
  2. Effective C++笔记(一)——条款26-29
  3. sql java blob_JAVA和SQL关于BLOB的很大的问题?……
  4. mysql const ref_mysql explain详解
  5. 剑指offerpython_《剑指offer》3. 从尾到头打印单链表值【Java+Python】
  6. c语言中switch语句流程图_C语言:C语言保留字(关键字)
  7. Java黑皮书课后题第5章:**5.21(金融应用:比较不同利率下的贷款)编写程序,让用户输入输入贷款总额和以年为单位的贷款期限,然后显示利率从5%到8%每次递增1/8的各种利率下,每月支付额和总支付
  8. 2010年杭电计算机研究生复试---笔试编程
  9. 算法2:邻居好说话:冒泡排序
  10. JDBC中的SPI实现