首页 > 数据库 >C/C++ Qt 数据库SqlRelationalTable关联表

C/C++ Qt 数据库SqlRelationalTable关联表

时间:2023-07-06 11:32:33浏览次数:43  
标签:departID Qt SqlRelationalTable exec db C++ ui Student tabModel


在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelationalTable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,名称)就是用来实现多表之间快速关联的。

首先我们创建两张表,一张Student表存储学生名字以及学生课程号,另一张Departments存储每个编号所对应的系所名称,运行代码完成创建。

void MainWindow::InitSQL()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("./lyshark.db");
    if (!db.open())
           return;

    // 执行SQL创建表
    db.exec("DROP TABLE Student");
    db.exec("CREATE TABLE Student ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   "departID INTEGER NOT NULL)"
            );

    // 逐条插入数据
    db.exec("INSERT INTO Student(name,departID) VALUES('zhangsan',10)");
    db.exec("INSERT INTO Student(name,departID) VALUES('lisi',20)");
    db.exec("INSERT INTO Student(name,departID) VALUES('wangwu',30)");
    db.exec("INSERT INTO Student(name,departID) VALUES('wangmazi',40)");

    db.exec("DROP TABLE Departments");
    db.exec("CREATE TABLE Departments("
            "departID INTEGER NOT NULL,"
            "department VARCHAR(40) NOT NULL)"
            );

    db.exec("INSERT INTO Departments(departID,department) VALUES (10,'数学学院')");
    db.exec("INSERT INTO Departments(departID,department) VALUES (20,'物理学院')");
    db.exec("INSERT INTO Departments(departID,department) VALUES (30,'计算机学院')");
    
    db.commit();
    db.close();
}

初始化后将得到两张数据表,这两张表通过departID相关联,如下:

C/C++ Qt 数据库SqlRelationalTable关联表_数据库

创建完成后,我们在程序的构造函数直接实现绑定即可,这段代码很简单如下:


MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    InitSQL();

    // 打开数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("./lyshark.db");
    if (!db.open())
        return;

    this->setCentralWidget(ui->tableView);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tableView->setAlternatingRowColors(true);

    // 打开数据表
    tabModel=new QSqlRelationalTableModel(this,DB);
    tabModel->setTable("Student");                              // 设置数据表
    tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);  // OnManualSubmit
    tabModel->setSort(0,Qt::AscendingOrder);

    tabModel->setHeaderData(0,Qt::Horizontal,"学号");
    tabModel->setHeaderData(1,Qt::Horizontal,"姓名");
    tabModel->setHeaderData(2,Qt::Horizontal,"学院");

    // 设置代码字段的查询关系数据表
    // 打开Departments表,关联ID和department
    tabModel->setRelation(2,QSqlRelation("Departments","departID","department"));
    theSelection=new QItemSelectionModel(tabModel);

    ui->tableView->setModel(tabModel);
    ui->tableView->setSelectionModel(theSelection);
    ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView)); // 为关系型字段设置缺省代理组件

    tabModel->select();                                                        // 打开数据表
}

MainWindow::~MainWindow()
{
    delete ui;
}

最终绑定效果如下图:

C/C++ Qt 数据库SqlRelationalTable关联表_qt_02


标签:departID,Qt,SqlRelationalTable,exec,db,C++,ui,Student,tabModel
From: https://blog.51cto.com/lyshark/6640418

相关文章

  • C/C++ HOOK 全局 API
    全局Hook不一定需要用到Dll,比如全局的鼠标钩子、键盘钩子都是不需要Dll的,但是要钩住API,就需要Dll的协助了,下面直接放上Dll的代码,注意这里使用的是MFCDLL。//Test_Dll(mfc).cpp:定义DLL的初始化例程。//#include"stdafx.h"#include"Test_Dll(mfc).h"#ifde......
  • c++ day1
    跟着数据结构,算法与应用c++语言描述来学习本书第一周计划回顾c++的基础知识本人只是记录自己认为要去记录的一些资料想要系统的学习还是需要去啃书1template<classT>是C++中用于定义模板的语法结构。它表明接下来的代码是一个模板,并且模板参数名为T,它可以是任意合法的C++......
  • Qt防止程序重复运行
    1.使用共享内存的方法 弊端:使用共享内存方式,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。参考:qt之使程序只运行一个实例,若再次点击exe则将已运行的实例置在最顶层显示_大桶矿泉水......
  • 【嵌入式】keil5中使用C,C++混合编译
    5份文件:a.c和a.h和b.cpp和b.h和main.c其中main.c调用b.cpp,b.cpp调用a.c main.c#include"./b.h"intmain(void){ intt=funC(); while(1) { }} b.h#ifndef_B_#define_B_#ifdef__cplusplusextern"C"{#endifintfunC(void);#ifdef__cplusp......
  • Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
    https://blog.csdn.net/qq_21438461/article/details/130764349Linux系统编程C/C++以及Qt中的零拷贝技术:从底层原理到高级应用一、零拷贝技术的概念与价值(Zero-CopyConceptandValue)1.1什么是零拷贝(WhatisZero-Copy)1.2为什么我们需要零拷贝(WhyWeNeedZero-C......
  • 如何在qt中使用gdal?
    首先是使用MinGW编译的GDAL库,这种貌似比较少见。。可见大家都还是喜欢用vs来编译https://zhuanlan.zhihu.com/p/355864559参考:https://blog.csdn.net/qq_32629895/article/details/105738977(介绍一种简单的在QT(MinGW)中使用gdal的方法)......
  • C++中使用typedef定义的UNIT_PTR,LONG_PTR等
    在看代码时,发现有用到WPARAM,LPARAM,LRESULT我去找它们的定义,发现在C:\ProgramFiles(x86)\WindowsKits\10\Include\10.0.19041.0\shared\minwindef.h中,有如下定义/*Typesuseforpassing&returningpolymorphicvalues*/typedefUINT_PTRWPARAM;typed......
  • QT 记Sqlite用法
    一、在.pro文件添加QT+=coreguisql二、头文件#include<QSqlDatabase>#include<QSqlError>#include<QSqlQuery> 三、用法1//以写的查询为例2QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");34db.setDatabaseNa......
  • QT 记串口的用法
    QSerialPort用法一、在.pro文件添加serialportQT+=coreguiserialport二、头文件#include<QSerialPort>#include<QSerialPortInfo>三、开启串口1voidWidget::on_pushButton_clicked()//自己写的按钮为例2{3QSerialPortInfoinfo;4QLis......
  • 常用 QT 样式与方法(按钮悬浮变色,渐变色等)
    1QSS按钮悬浮效果类似于企业微信等,鼠标悬浮在某按钮上,按钮会改变背景色来达到告知用户"选中"的效果,如下图所示:可以看到其实是background有一个浅灰色,同理,我们可以在hover的时候改变按钮的background如企业微信这样的作法,或者更改按钮文字颜色。主要使用的QT函数,示......