Qt實現(xiàn)編輯數(shù)據(jù)庫數(shù)據(jù)的方法詳解
前面幾章我們介紹了如何對數(shù)據(jù)庫進行操作以及如何使用圖形界面展示數(shù)據(jù)庫數(shù)據(jù)。本章我們將介紹如何對數(shù)據(jù)庫的數(shù)據(jù)進行編輯。當然,我們可以選擇直接使用 SQL 語句進行更新,這一點同前面所說的 model/view 的編輯沒有什么區(qū)別。除此之外,Qt 還為圖形界面提供了更方便的展示并編輯的功能。
普通數(shù)據(jù)的編輯很簡單,這里不再贅述。不過,我們通常會遇到多個表之間存在關聯(lián)的情況。首先我們要提供一個 city 表:
CREATE TABLE city ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR); INSERT INTO city (name) VALUES ('Beijing'); INSERT INTO city (name) VALUES ('Shanghai'); INSERT INTO city (name) VALUES ('Nanjing'); INSERT INTO city (name) VALUES ('Tianjin'); INSERT INTO city (name) VALUES ('Wuhan'); INSERT INTO city (name) VALUES ('Hangzhou'); INSERT INTO city (name) VALUES ('Suzhou'); INSERT INTO city (name) VALUES ('Guangzhou');
由于 city 表是一個參數(shù)表,所以我們直接將所需要的城市名稱直接插入到表中。接下來我們創(chuàng)建 student 表,并且使用外鍵連接 city 表:
CREATE TABLE student ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, address INTEGER, FOREIGN KEY(address) REFERENCES city(id));
我們重新創(chuàng)建 student 表(如果你使用的 RDBMS 支持 ALTER TABLE 語句直接修改表結構,就不需要重新創(chuàng)建了;否則的話只能先刪除舊的表,再創(chuàng)建新的表,例如 sqlite)。
這里需要注意一點,如果此時我們在 Qt 中直接使用
INSERT INTO student (name, age, address) VALUES ('Tom', 24, 100);
語句,盡管我們的 city 中沒有 ID 為 100 的記錄,但還是是可以成功插入的。這是因為雖然 Qt 中的 sqlite 使用的是支持外鍵的 sqlite3,但 Qt 將外鍵屏蔽掉了。為了啟用外鍵,我們需要首先使用 QSqlQuery 執(zhí)行:
PRAGMA foreign_keys = ON;
然后就會發(fā)現(xiàn)這條語句不能成功插入了。接下來我們插入一些正常的數(shù)據(jù):
INSERT INTO student (name, age, address) VALUES ('Tom', 20, 2); INSERT INTO student (name, age, address) VALUES ('Jack', 23, 1); INSERT INTO student (name, age, address) VALUES ('Jane', 22, 4); INSERT INTO student (name, age, address) VALUES ('Jerry', 25, 5);
下面,我們使用 model/view 方式來顯示數(shù)據(jù):
QSqlTableModel *model = new QSqlTableModel(this); model->setTable("student"); model->setSort(ColumnID_Name, Qt::AscendingOrder); model->setHeaderData(ColumnID_Name, Qt::Horizontal, "Name"); model->setHeaderData(ColumnID_Age, Qt::Horizontal, "Age"); model->setHeaderData(ColumnID_City, Qt::Horizontal, "City"); model->select(); QTableView *view = new QTableView(this); view->setModel(model); view->setSelectionMode(QAbstractItemView::SingleSelection); view->setSelectionBehavior(QAbstractItemView::SelectRows); view->resizeColumnsToContents(); QHeaderView *header = view->horizontalHeader(); header->setStretchLastSection(true);
這段代碼和我們前面見到的沒有什么區(qū)別。我們可以將其補充完整后運行一下看看:
注意外鍵部分:City 一列僅顯示出了我們保存的外鍵。如果我們使用 QSqlQuery,這些都不是問題,我們可以將外鍵信息放在一個 SQL 語句中 SELECT 出來。但是,我們不想使用 QSqlQuery,那么現(xiàn)在可以使用另外的一個模型:QSqlRelationalTableModel。QSqlRelationalTableModel 與 QSqlTableModel 十分類似,可以為一個數(shù)據(jù)庫表提供可編輯的數(shù)據(jù)模型,同時帶有外鍵的支持。下面我們修改一下我們的代碼:
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this); model->setTable("student"); model->setSort(ColumnID_Name, Qt::AscendingOrder); model->setHeaderData(ColumnID_Name, Qt::Horizontal, "Name"); model->setHeaderData(ColumnID_Age, Qt::Horizontal, "Age"); model->setHeaderData(ColumnID_City, Qt::Horizontal, "City"); model->setRelation(ColumnID_City, QSqlRelation("city", "id", "name")); model->select(); QTableView *view = new QTableView(this); view->setModel(model); view->setSelectionMode(QAbstractItemView::SingleSelection); view->setSelectionBehavior(QAbstractItemView::SelectRows); view->resizeColumnsToContents(); view->setItemDelegate(new QSqlRelationalDelegate(view)); QHeaderView *header = view->horizontalHeader(); header->setStretchLastSection(true);
這段代碼同前面的幾乎一樣。我們首先創(chuàng)建一個 QSqlRelationalTableModel 對象。注意,這里我們有一個 setRelation() 函數(shù)的調(diào)用。該語句說明,我們將第 ColumnID_City 列作為外鍵,參照于 city 表的 id 字段,使用 name 進行顯示。另外的 setItemDelegate() 語句則提供了一種用于編輯外鍵的方式。運行一下程序看看效果:
此時,我們的外鍵列已經(jīng)顯示為 city 表的 name 字段的實際值。同時在編輯時,系統(tǒng)會自動成為一個 QComboBox 供我們選擇。當然,我們需要自己將選擇的外鍵值保存到實際記錄中,這部分我們前面已經(jīng)有所了解。
到此這篇關于Qt實現(xiàn)編輯數(shù)據(jù)庫數(shù)據(jù)的方法詳解的文章就介紹到這了,更多相關Qt編輯數(shù)據(jù)庫數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux下c語言中隱藏進程命令行參數(shù)(例如輸入密碼等高危操作)
啟動程序很多時候用命令行參數(shù)可以很方便,做到簡化一些配置,但是輸入用戶名密碼等操作,如果通過進程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法2021-01-01C語言實現(xiàn)的統(tǒng)計素數(shù)并求和代碼分享
這篇文章主要介紹了C語言實現(xiàn)的統(tǒng)計素數(shù)并求和代碼分享,來自PAT平臺(浙江大學計算機程序設計能力考試系統(tǒng))的一個題目,需要的朋友可以參考下2014-08-08探究C++中string類的實現(xiàn)原理以及擴展使用
這篇文章主要介紹了C++中string類的實現(xiàn)原理以及擴展使用,從內(nèi)存分配角度進行了深入探究,需要的朋友可以參考下2015-12-12VC6.0打開文件以及向工程中添加文件時程序崩潰自動退出解決方法
vc6.0程序中,點擊打開文件以及向工程中添加文件時,程序竟然崩潰自動退出了,不知什么原因,安裝相同的vc程序,本本竟然出現(xiàn)此緣故2013-01-01C++利用opencv實現(xiàn)單目測距的實現(xiàn)示例
本文主要介紹了C++利用opencv實現(xiàn)單目測距的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11