[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel
生活随笔
收集整理的這篇文章主要介紹了
[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[Qt教程]?第26篇 數據庫(六)SQL關系表格模型QSqlRelationalTableModel
??|?查看: 677|?回復: 6| SQL關系表格模型QSqlRelationalTableModel 版權聲明 該文章原創于作者yafeilinux,轉載請注明出處! 導語 ? ?? ? QSqlRelationalTableModel繼承自QSqlTableModel,并且對其進行了擴展,提供了對外鍵的支持。一個外鍵就是一個表中的一個屬性和其他表中的主鍵屬性之間的一對一的映射。例如,student表中的course屬性對應的是course表中的id屬性,那么就稱屬性course是一個外鍵。因為這里的course屬性的值是一些數字,這樣的顯示很不友好,使用關系表格模型,就可以將它顯示為course表中的name屬性的值。 環境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2 目錄 一、使用外鍵 二、使用委托 正文 一、使用外鍵 1.新建Qt Gui應用,名稱為relationalTableModel,基類為QMainWindow,類名為MainWindow。完成后打開relationalTableModel.pro項目文件,將第一行改為: QT? ?? ??+= coregui sql 然后保存該文件。 2.下面向項目中添加新的C++頭文件connection.h,并更改其內容如下: #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 在這里建立了兩個表,student表中有一項是course,它是int型的,而course表的主鍵也是int型的。如果要將course項和course表進行關聯,它們的類型就必須相同,一定要注意這一點。 3.更改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(); } 4.然后到mainwindow.h文件中,先包含頭文件: #include<QSqlRelationalTableModel> 然后添加private類型對象聲明: QSqlRelationalTableModel?*model; 5.到設計模式,往界面上拖放一個Table View部件。 6.到mainwindow.cpp文件中,在構造函數里添加如下代碼: 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,?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表示只要屬性被改動就馬上寫入數據庫,這樣就不需要我們再執行提交函數了。setRelation()函數實現了創建外鍵,注意它的格式就行了。 7.運行程序,效果如下圖所示。 ? 可以看到Course屬性已經不再是編號,而是具體的課程了。關于外鍵,大家也應該有一定的認識了吧,說簡單點就是將兩個相關的表建立一個橋梁,讓它們關聯起來。 二、使用委托 有時我們也希望,如果用戶更改課程屬性,那么只能在課程表中有的課程中進行選擇,而不能隨意填寫課程。Qt中還提供了一個QSqlRelationalDelegate委托類,它可以為QSqlRelationalTableModel顯示和編輯數據。這個委托為一個外鍵提供了一個QComboBox部件來顯示所有可選的數據,這樣就顯得更加人性化了。使用這個委托是很簡單的,我們先在mainwindow.cpp文件中添加頭文件#include?<QSqlRelationalDelegate>,然后繼續在構造函數中添加如下一行代碼: ui->tableView->setItemDelegate( ? ?? ?? ?? ?? ??new?QSqlRelationalDelegate(ui->tableView)); 運行程序,效果如下圖所示。 結語 ? ?我們可以根據自己的需要來選擇使用哪個模型。如果熟悉SQL語法,又不需要將所有的數據都顯示出來,那么只需要使用QSqlQuery就可以了。對于QSqlTableModel,它主要是用來顯示一個單獨的表格的,而QSqlQueryModel可以用來顯示任意一個結果集,如果想顯示任意一個結果集,而且想使其可讀寫,那么建議子類化QSqlQueryModel,然后重新實現flags()和setData()函數。更多相關內容請查看《Qt Creator快速入門》第17章。 涉及到的源碼下載:??relationalTableModel.zip?? |
總結
以上是生活随笔為你收集整理的[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Qt教程] 第27篇 XML(一)使用
- 下一篇: [Qt教程] 第28篇 XML(二)使用