日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【Qt】数据库实战之QSqlRelationalTableModel

發布時間:2024/4/24 数据库 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】数据库实战之QSqlRelationalTableModel 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。