• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            zhonghua

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks
            該類為單張的數(shù)據(jù)庫表提供了一個可編輯的數(shù)據(jù)模型,它支持外鍵,除此之外和QSqlTableModel沒有什么不同
            1. model = new QSqlRelationalTableModel(this);  
            2. model->setEditStrategy(QSqlTableModel::OnFieldChange); //屬性變化時寫入數(shù)據(jù)庫  
            3. model->setTable("student");  
            4. model->setRelation(2,QSqlRelation("course","id","name"));//將student表的第三個屬性設(shè)為course表的id屬性的外鍵,并將其顯示為course表的name屬性的值  
            5. model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));  
            6. model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));  
            7. model->setHeaderData(2, Qt::Horizontal, QObject::tr("Course"));  
            8. model->select();  
            9. tableView->setModel(model);  

             

            如果我們希望用戶更改課程屬性時,只能在課程表中已有的課程中進(jìn)行選擇,而不能隨意填寫課程,那么Qt中的QSqlRelationalDelegate委托類就能實現(xiàn)這個功能

            1. tableView->setItemDelegate(new QSqlRelationalDelegate(tableView)); 

            例子:

            QSqlRelationalTableModel,該類為單張的數(shù)據(jù)庫表提供了一個可編輯的數(shù)據(jù)模型,它支持外鍵。
            我 們還是新建Qt4 Gui Application工程,我這里工程名為relationalTableModel ,然后選中QtSql模塊,Base class選QWidget。工程建好后,添加C++ Header File ,命名為database.h,更改其內(nèi)容如下:
            #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表進(jìn)行關(guān)聯(lián),它們的類型就必須相同,一定要注意這一點(diǎn)。
            然后將main.cpp中的內(nèi)容更改如下:
            #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中的構(gòu)造函數(shù)里添加如下代碼:
                model = new QSqlRelationalTableModel(this);
                model->setEditStrategy(QSqlTableModel::OnFieldChange); //屬性變化時寫入數(shù)據(jù)庫
                model->setTable("student");
                model->setRelation(2,QSqlRelation("course","id","name"));
                //將student表的第三個屬性設(shè)為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表示只要屬性被改動就馬上寫入數(shù)據(jù)庫,這樣就不需要我們再執(zhí)行提交函數(shù)了。setRelation()函數(shù)實現(xiàn)了創(chuàng)建外鍵,注意它的格式就行了。
            運(yùn)行效果如下:


            可以看到Course屬性已經(jīng)不再是編號,而是具體的課程了。關(guān)于外鍵,你也應(yīng)該有一定的認(rèn)識了吧,說簡單點(diǎn)就是將兩個相關(guān)的表建立一個橋梁,讓它們關(guān)聯(lián)起來。
            那么我們也希望,如果用戶更改課程屬性,那么他只能在課程表中有的課程中進(jìn)行選擇,而不能隨意填寫課程。在Qt中的QSqlRelationalDelegate委托類就能實現(xiàn)這個功能。我們只需在上面的構(gòu)造函數(shù)的最后添加一行代碼:
            ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));
            添加代理(委托),在我這里不知為什么會出現(xiàn)SqlRelationalDelegate is not a type name的提示,不過可以編譯通過。
            我們需要在widget.cpp中添加頭文件: #include <QSqlRelationalDelegate>
            運(yùn)行效果如下:


            可以看到這時修改Course屬性時,就會出現(xiàn)一個下拉框,只能選擇course表中的幾個值。
            而利用這個類來操作數(shù)據(jù)庫,與前面講到的QSqlTableModel沒有區(qū)別,這里就不再重復(fù)。這幾篇文章一共講了好幾種操作數(shù)據(jù)庫的方法,到底應(yīng)該使用哪個呢?那就看你的需求了,根據(jù)這幾種方法的特點(diǎn)進(jìn)行選擇吧。


            posted on 2012-04-24 14:39 米米 閱讀(534) 評論(0)  編輯 收藏 引用 所屬分類: qt
            久久亚洲高清综合| 国产精品福利一区二区久久| 国产免费久久精品99久久| 国产成人久久精品麻豆一区 | 国产精品99久久久久久猫咪| 激情久久久久久久久久| 精品熟女少妇AV免费久久 | 久久久久久午夜成人影院| 久久香蕉国产线看观看乱码| 色老头网站久久网| 久久国产精品久久国产精品| 欧美精品国产综合久久| 色综合久久综合网观看| 久久强奷乱码老熟女网站| 999久久久免费国产精品播放| 蜜桃麻豆WWW久久囤产精品| 一级做a爰片久久毛片16| 久久青青草原亚洲av无码app| 无码乱码观看精品久久| 国产AV影片久久久久久| 久久久久夜夜夜精品国产| 久久久久亚洲av无码专区喷水| 久久中文字幕无码专区| 狠狠精品干练久久久无码中文字幕| 久久青青草原精品国产| 亚洲精品国产美女久久久| 久久综合色之久久综合| 国产精品久久久久一区二区三区| 久久国产色AV免费看| 亚洲精品高清国产一线久久 | 久久久久免费精品国产| 91久久精品91久久性色| 成人国内精品久久久久一区| 无码精品久久久天天影视| 性做久久久久久久| 久久综合给合久久狠狠狠97色69| 久久久久精品国产亚洲AV无码| 蜜桃麻豆WWW久久囤产精品| 99精品国产免费久久久久久下载| 久久无码专区国产精品发布| 久久久www免费人成精品|