zoukankan      html  css  js  c++  java
  • C/C++ Qt 数据库SqlRelationalTable关联表

    在上一篇博文中详细介绍了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相关联,如下:

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

    // https://www.cnblogs.com/lyshark
    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;
    }
    

    最终绑定效果如下图:

    文章出处:https://www.cnblogs.com/LyShark/p/15668393.html
    版权声明:本博客文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!

    如果您恶意转载本人文章并被本人发现,则您的整站文章,将会变为我的原创作品,请相互尊重 !
  • 相关阅读:
    “工业4.0”下的可视化工厂建设方案
    logstash 发送慢页面到zabbix告警
    windows 挂载linux nfs
    zabbix报警把特定的应用集发送给developer
    logstash 判断接口响应时间发送zabbix告警
    zabbix 对于logstash告警连续发邮件
    zabbix 发送邮件配置
    zabbix如何选择适合的监控类型(107)
    logstash 发送zabbix告警
    zabbix 添加自定义key
  • 原文地址:https://www.cnblogs.com/LyShark/p/15668393.html
Copyright © 2011-2022 走看看