Qt-数据库开发-外键使用(4)
创始人
2024-04-20 12:23:19
0

Qt-数据库开发-使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键]

文章目录

  • Qt-数据库开发-使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键]
    • 1、概述
    • 2、实现效果
    • 3、主要代码
    • 4、完整源代码

更多精彩内容
👉个人内容分类汇总 👈
👉数据库开发 👈

1、概述

  • 这是通过学习Qt官方Demo产生的一个示例;
  • 通过自己理解加入了一些更加详细便于学习的内容;
  • 添加了非常详细的注释信息,对于小白更加友好。

开发环境说明

  • 系统:Windows10、Ubuntu20.04
  • Qt版本:V5.12.5
  • 编译器:MSVC2017-64、GCC/G++64

2、实现效果

  1. 本示例展示了如何使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键]的使用。
  2. 程序启动时自动创建一个数据库,并创建一个主表个两个从表,可选择创建文件数据还是内存数据库;
  3. 通过主表中的【外键】去关联子表中的数据;
  4. 只有一个main.cpp,十分简单便于学习。
  • 实现效果如下:

    在这里插入图片描述

3、主要代码

  • 啥也不说了,直接上代码,一切有注释

  • pro文件: Qt使用到数据库,上来什么都别管,先在pro文件添加上QT += sql widgets

  • main.cpp文件:程序第一次启动时在main函数中创建数据库并写入数据,并通过QTableView显示数据库内容;

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include /*** @brief  创建并打开一个QSqlite数据库,并创建一个主表、两个从表* @return*/
    bool createConnection()
    {QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  // 使用数据库驱动(Qsqlite)和默认连接名称(qt_sql_default_connection)添加一个数据库
    //    qDebug() << QSqlDatabase::defaultConnection;           // 打印默认数据库连接名称
    #if 1db.setDatabaseName("test.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)
    #elsedb.setDatabaseName(":memory:");       // 使用内存数据库(不会生成数据库文件,所有数据都在内存中进行操作,性能强,程序退出后数据丢失)
    #endifif(!db.open())             // 打开数据库{QMessageBox::critical(nullptr, "Error", "打开数据库失败!");return false;}QSqlQuery query;          // 创建一个用于执行和操作Sql语句的对象// 创建一个主表person,包含id、name、grade、class四个字段query.exec("create table student (""id         int         primary key,"    // 索引"name       varchar(20),"                // 姓名"grade      int,"                        // 年级"class      int )");                     // 班级query.exec("insert into student values(1, '大毛', 3, 2)");       // 插入学生数据(大毛、三年级2班)query.exec("insert into student values(2, '二毛', 3, 1)");query.exec("insert into student values(3, '三毛', 2, 3)");query.exec("insert into student values(4, '小毛', 1, 4)");query.exec("create table grade (id int, name varchar(20))");  // 创建年级从表query.exec("insert into grade values(1, '一年级')");query.exec("insert into grade values(2, '二年级')");query.exec("insert into grade values(3, '三年级')");query.exec("create table class (id int, name varchar(20))");  // 创建班级从表query.exec("insert into class values(1, '(1)班')");query.exec("insert into class values(2, '(2)班')");query.exec("insert into class values(3, '(3)班')");query.exec("insert into class values(4, '(4)班')");return true;
    }/*** @brief        初始化设置model* @param model*/
    void initModel(QSqlRelationalTableModel* model)
    {model->setTable("student");model->setEditStrategy(QSqlTableModel::OnManualSubmit);      // 在界面修改后不立即保存到数据库model->setRelation(2, QSqlRelation("grade", "id", "name"));  // 将第2列数据通过外键关联到从表model->setRelation(3, QSqlRelation("class", "id", "name"));// 设置列标题model->setHeaderData(0, Qt::Horizontal, "ID");model->setHeaderData(1, Qt::Horizontal, "姓名");model->setHeaderData(2, Qt::Horizontal, "年级");model->setHeaderData(3, Qt::Horizontal, "班级");model->select();   // 查询数据库数据
    }int main(int argc, char *argv[])
    {QApplication a(argc, argv);if(!createConnection()) return -1;         // 打开数据库并创建一个主表、两个子表QSqlRelationalTableModel model;            // 创建一个支持使用外键的modelinitModel(&model);QTableView* view = new QTableView;         // 创建一个表格视图,用于显示数据库数据view->resize(500, 300);view->setWindowTitle(QString("QSql-通过QSqlRelationalTableModel类使用外键Demo - V%1").arg(APP_VERSION));view->setModel(&model);view->setItemDelegate(new QSqlRelationalDelegate(view));  // 与默认委托不同,QSqlRelationalDelegate 为其他表的外键字段提供了一个组合框view->show();return a.exec();
    }

4、完整源代码

  • github
  • gitee

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...