<a target="_blank" href="http://bbs.qter.org/forum.php?mod=viewthread&tid=187">樓主</a>

發表于 2013-5-21 20:54:13 | 檢視:
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)");
into student values(2,'yafei1',1)");
into student values(3,'yafei2',2)");
query.exec("create table course (id int primarykey, name vchar, teacher vchar)");
into course values(1,'math','yafeilinux1')");
into course values(2,'english','yafeilinux2')");
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));
運作程式,效果如下圖所示。
結語
涉及到的源碼下載下傳:
kb, 下載下傳次數: 8)