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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel

發(fā)布時(shí)間:2024/4/20 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[Qt教程]?第26篇 數(shù)據(jù)庫(kù)(六)SQL關(guān)系表格模型QSqlRelationalTableModel

樓主 ?發(fā)表于 2013-5-21 20:54:13?|?查看: 677|?回復(fù): 6
SQL關(guān)系表格模型QSqlRelationalTableModel
版權(quán)聲明
該文章原創(chuàng)于作者yafeilinux,轉(zhuǎn)載請(qǐng)注明出處!

導(dǎo)語(yǔ)
? ?? ? QSqlRelationalTableModel繼承自QSqlTableModel,并且對(duì)其進(jìn)行了擴(kuò)展,提供了對(duì)外鍵的支持。一個(gè)外鍵就是一個(gè)表中的一個(gè)屬性和其他表中的主鍵屬性之間的一對(duì)一的映射。例如,student表中的course屬性對(duì)應(yīng)的是course表中的id屬性,那么就稱屬性course是一個(gè)外鍵。因?yàn)檫@里的course屬性的值是一些數(shù)字,這樣的顯示很不友好,使用關(guān)系表格模型,就可以將它顯示為course表中的name屬性的值。

環(huán)境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2

目錄
一、使用外鍵 二、使用委托

正文

一、使用外鍵
1.新建Qt Gui應(yīng)用,名稱為relationalTableModel,基類為QMainWindow,類名為MainWindow。完成后打開(kāi)relationalTableModel.pro項(xiàng)目文件,將第一行改為: QT? ?? ??+= coregui sql 然后保存該文件。
2.下面向項(xiàng)目中添加新的C++頭文件connection.h,并更改其內(nèi)容如下: #ifndef?CONNECTION_H #define?CONNECTION_H #include?<QSqlDatabase> #include?<QSqlQuery> static?bool?createConnection() { ? ?QSqlDatabase?db?=?QSqlDatabase::addDatabase("QSQLITE"); ? ?db.setDatabaseName("database.db"); ? ?if(!db.open())?return?false; ? ?QSqlQuery?query; ? ?query.exec("create table student (id int primarykey, name vchar,course int)"); ? ?query.exec("insert into student values(1,'yafei0',1)"); ? ?query.exec("insert into student values(2,'yafei1',1)"); ? ?query.exec("insert into student values(3,'yafei2',2)"); ? ? query.exec("create table course (id int primarykey, name vchar, teacher vchar)"); ? ?query.exec("insert into course values(1,'Math','yafeilinux1')"); ? ?query.exec("insert into course values(2,'English','yafeilinux2')"); ? ?query.exec("insert into course values(3,'Computer','yafeilinux3')"); ? ?return?true; } #endif?// CONNECTION_H
在這里建立了兩個(gè)表,student表中有一項(xiàng)是course,它是int型的,而course表的主鍵也是int型的。如果要將course項(xiàng)和course表進(jìn)行關(guān)聯(lián),它們的類型就必須相同,一定要注意這一點(diǎn)。
3.更改main.cpp文件內(nèi)容如下: #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(); }

4.然后到mainwindow.h文件中,先包含頭文件: #include<QSqlRelationalTableModel> 然后添加private類型對(duì)象聲明: QSqlRelationalTableModel?*model;

5.到設(shè)計(jì)模式,往界面上拖放一個(gè)Table View部件。

6.mainwindow.cpp文件中,在構(gòu)造函數(shù)里添加如下代碼: model?=?new?QSqlRelationalTableModel(this); //屬性變化時(shí)寫入數(shù)據(jù)庫(kù) model->setEditStrategy(QSqlTableModel::OnFieldChange); model->setTable("student"); //將student表的第三個(gè)屬性設(shè)為course表的id屬性的外鍵, //并將其顯示為course表的name屬性的值 model->setRelation(2,QSqlRelation("course","id","name")); model->setHeaderData(0,?Qt::Horizontal,?QObject::tr("ID")); model->setHeaderData(1,?Qt::Horizontal,?QObject::tr("Name")); model->setHeaderData(2,?Qt::Horizontal,?QObject::tr("Course")); model->select(); ui->tableView->setModel(model);
這里修改了model的提交策略,OnFieldChange表示只要屬性被改動(dòng)就馬上寫入數(shù)據(jù)庫(kù),這樣就不需要我們?cè)賵?zhí)行提交函數(shù)了。setRelation()函數(shù)實(shí)現(xiàn)了創(chuàng)建外鍵,注意它的格式就行了。

7.運(yùn)行程序,效果如下圖所示。
?

可以看到Course屬性已經(jīng)不再是編號(hào),而是具體的課程了。關(guān)于外鍵,大家也應(yīng)該有一定的認(rèn)識(shí)了吧,說(shuō)簡(jiǎn)單點(diǎn)就是將兩個(gè)相關(guān)的表建立一個(gè)橋梁,讓它們關(guān)聯(lián)起來(lái)。

二、使用委托
有時(shí)我們也希望,如果用戶更改課程屬性,那么只能在課程表中有的課程中進(jìn)行選擇,而不能隨意填寫課程。Qt中還提供了一個(gè)QSqlRelationalDelegate委托類,它可以為QSqlRelationalTableModel顯示和編輯數(shù)據(jù)。這個(gè)委托為一個(gè)外鍵提供了一個(gè)QComboBox部件來(lái)顯示所有可選的數(shù)據(jù),這樣就顯得更加人性化了。使用這個(gè)委托是很簡(jiǎn)單的,我們先在mainwindow.cpp文件中添加頭文件#include?<QSqlRelationalDelegate>,然后繼續(xù)在構(gòu)造函數(shù)中添加如下一行代碼: ui->tableView->setItemDelegate( ? ?? ?? ?? ?? ??new?QSqlRelationalDelegate(ui->tableView));
運(yùn)行程序,效果如下圖所示。

結(jié)語(yǔ)
? ?我們可以根據(jù)自己的需要來(lái)選擇使用哪個(gè)模型。如果熟悉SQL語(yǔ)法,又不需要將所有的數(shù)據(jù)都顯示出來(lái),那么只需要使用QSqlQuery就可以了。對(duì)于QSqlTableModel,它主要是用來(lái)顯示一個(gè)單獨(dú)的表格的,而QSqlQueryModel可以用來(lái)顯示任意一個(gè)結(jié)果集,如果想顯示任意一個(gè)結(jié)果集,而且想使其可讀寫,那么建議子類化QSqlQueryModel,然后重新實(shí)現(xiàn)flags()setData()函數(shù)。更多相關(guān)內(nèi)容請(qǐng)查看《Qt Creator快速入門》17章。


涉及到的源碼下載:??relationalTableModel.zip?(3.08 KB, 下載次數(shù): 8)?

總結(jié)

以上是生活随笔為你收集整理的[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。