Qt資料庫(七)QSqlRelationalTableModel

來源:互聯網
上載者:User

本文章原創於www.yafeilinux.com 轉載請註明出處。

講完QSqlTableModel了,我們這次講這個類的擴充類QSqlRelationalTableModel,它們沒有太大的不同,唯一的就是後者在前者的基礎之上添加了外鍵(或者叫外碼)的支援。

QSqlRelationalTableModel,該類為單張的資料庫表提供了一個可編輯的資料模型,它支援外鍵。

我們還是建立Qt4 Gui Application工程,我這裡工程名為relationalTableModel ,然後選中QtSql模組,Base class選QWidget。工程建好後,添加C++ Header File ,命名為database.h,更改其內容如下:

 

 

#ifndef DATABASE_H
#define DATABASE_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 primary key, 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 primary key, 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 // DATABASE_H

我們在這裡建立了兩個表,student表中有一項是course,它是int型的,而course表的主鍵也是int型的。如果要將course項和course表進行關聯,它們的類型就必須相同,一定要注意這一點。

然後將main.cpp中的內容更改如下:

#include <QtGui/QApplication>
#include “widget.h”
#include “database.h”
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createConnection()) return 1;
    Widget w;
    w.show();
    return a.exec();
}

我們在widget.h中添加標頭檔: #include <QSqlRelationalTableModel>

然後在private中聲明對象:    QSqlRelationalTableModel *model;

我們在widget.ui中添加一個Table View組件到表單上,然後到widget.cpp中的建構函式裡添加如下代碼:

    model = new QSqlRelationalTableModel(this);
    model->setEditStrategy(QSqlTableModel::OnFieldChange); //屬性變化時寫入資料庫
    model->setTable(“student”);
    model->setRelation(2,QSqlRelation(“course”,”id”,”name”));
    //將student表的第三個屬性設為course表的id屬性的外鍵,並將其顯示為course表的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()函數實現了建立外鍵,注意它的格式就行了。

運行效果如下:


可以看到Course屬性已經不再是編號,而是具體的課程了。關於外鍵,你也應該有一定的認識了吧,說簡單點就是將兩個相關的表建立一個橋樑,讓它們關聯起來。

那麼我們也希望,如果使用者更改課程屬性,那麼他只能在課程表中有的課程中進行選擇,而不能隨意填寫課程。在Qt中的QSqlRelationalDelegate委託類就能實現這個功能。我們只需在上面的建構函式的最後添加一行代碼:

ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));

添加代理(委託),在我這裡不知為什麼會出現SqlRelationalDelegate is not a type name的提示,不過可以編譯通過。

我們需要在widget.cpp中添加標頭檔: #include <QSqlRelationalDelegate>

運行效果如下:


可以看到這時修改Course屬性時,就會出現一個下拉框,只能選擇course表中的幾個值。

而利用這個類來操作資料庫,與前面講到的QSqlTableModel沒有區別,這裡就不再重複。這幾篇文章一共講了好幾種操作資料庫的方法,到底應該使用哪個呢?那就看你的需求了,根據這幾種方法的特點進行選擇吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.