Qt數(shù)據(jù)庫(kù) QSqlQueryModel實(shí)例操作 上篇
Qt數(shù)據(jù)庫(kù) QSqlQueryModel實(shí)例操作 上篇是本文要介紹內(nèi)容中一節(jié),分為上下篇。在上一篇的***我們說(shuō)到,Qt中使用了自己的機(jī)制來(lái)避免使用SQL語(yǔ)句,它為我們提供了更簡(jiǎn)單的數(shù)據(jù)庫(kù)操作和數(shù)據(jù)顯示模型。它們分別是只讀的QSqlQueryModel,操作單表的QSqlTableModel和以及可以支持外鍵的QSqlRelationalTableModel。這次我們先講解QSqlQueryModel。
QSqlQueryModel類為SQL的結(jié)果集提供了一個(gè)只讀的數(shù)據(jù)模型,下面我們先利用這個(gè)類進(jìn)行一個(gè)最簡(jiǎn)單的操作。
我們新建Qt4 Gui Application工程,我這里工程名為queryModel ,然后選中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)”);
- query.exec(“insert into student values (0,’yafei0′)”);
- query.exec(“insert into student values (1,’yafei1′)”);
- query.exec(“insert into student values (2,’yafei2′)”);
- return true;
- }
- #endif // DATABASE_H
這里我們使用了db.setDatabaseName(“database.db”); ,我們沒(méi)有再使用以前的內(nèi)存數(shù)據(jù)庫(kù),而是使用了真實(shí)的文件,這樣后面對(duì)數(shù)據(jù)庫(kù)進(jìn)行的操作就能保存下來(lái)了。
然后進(jì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();
- }
下面我們?cè)趙idget.ui中添加一個(gè)顯示為“查詢”的Push Button,并進(jìn)入其單擊事件槽函數(shù),更改如下:
- void Widget::on_pushButton_clicked()
- {
- QSqlQueryModel *model = new QSqlQueryModel;
- model->setQuery(“select * from student”);
- model->setHeaderData(0, Qt::Horizontal, tr(“id”));
- model->setHeaderData(1, Qt::Horizontal, tr(“name”));
- QTableView *view = new QTableView;
- view->setModel(model);
- view->show();
- }
我們新建了QSqlQueryModel類對(duì)象model,并用setQuery()函數(shù)執(zhí)行了SQL語(yǔ)句“(“select * from student”);”用來(lái)查詢整個(gè)student表的內(nèi)容,可以看到,該類并沒(méi)有完全避免SQL語(yǔ)句。然后我們?cè)O(shè)置了表中屬性顯示時(shí)的名字。***我們建立了一個(gè)視圖view,并將這個(gè)model模型關(guān)聯(lián)到視圖中,這樣數(shù)據(jù)庫(kù)中的數(shù)據(jù)就能在窗口上的表中顯示出來(lái)了。
我們?cè)趙idget.cpp中添加頭文件:
- #include <QSqlQueryModel>
- #include <QTableView>
我們運(yùn)行程序,并按下“查詢”按鍵,效果如下:
我們?cè)诠こ涛募A下查看數(shù)據(jù)庫(kù)文件:
下面我們利用這個(gè)模型來(lái)操作數(shù)據(jù)庫(kù)。
1.我們?cè)趘oid Widget::on_pushButton_clicked()函數(shù)中添加如下代碼:
- int column = model->columnCount(); //獲得列數(shù)
- int row = model->rowCount(); // 獲得行數(shù)
- QSqlRecord record = model->record(1); //獲得一條記錄
- QModelIndex index = model->index(1,1); //獲得一條記錄的一個(gè)屬性的值
- qDebug() << “column num is:” << column << endl
- << “row num is:” << row << endl
- <<”the second record is:” << record << endl
- << “the data of index(1,1) is:”<< index.data();
在我們?cè)趙idget.cpp中添加頭文件:
- #include <QSqlRecord>
- #include <QModelIndex>
- #include <QDebug>
此時(shí)運(yùn)行程序,效果如下:
2.當(dāng)然我們?cè)谶@里也可以使用前面介紹過(guò)的query執(zhí)行SQL語(yǔ)句。
例如我們?cè)趘oid Widget::on_pushButton_clicked()函數(shù)中添加如下代碼:
- QSqlQuery query = model->query();
- query.exec(“select name from student where id = 2 “);
- query.next();
- qDebug() << query.value(0).toString();
這樣就可以輸出表中的值了,你可以運(yùn)行程序測(cè)試一下。
3.當(dāng)我們將函數(shù)改為如下。
- void Widget::on_pushButton_clicked()
- {
- QSqlQueryModel *model = new QSqlQueryModel;
- model->setQuery(“select * from student”);
- model->setHeaderData(0, Qt::Horizontal, tr(“id”));
- model->setHeaderData(1, Qt::Horizontal, tr(“name”));
- QTableView *view = new QTableView;
- view->setModel(model);
- view->show();
- QSqlQuery query = model->query();
- query.exec(“insert into student values (10,’yafei10′)”);
- //插入一條記錄
- }
這時(shí)我們運(yùn)行程序,效果如下:
我們發(fā)現(xiàn)表格中并沒(méi)有增加記錄,怎么回事呢?
我們關(guān)閉程序,再次運(yùn)行,效果如下:
發(fā)現(xiàn)這次新的記錄已經(jīng)添加了。在上面我們執(zhí)行了添加記錄的SQL語(yǔ)句,但是在添加記錄之前,就已經(jīng)進(jìn)行顯示了,所以我們的更新沒(méi)能動(dòng)態(tài)的顯示出來(lái)。為了能讓其動(dòng)態(tài)地顯示我們的更新,我們可以將函數(shù)更改如下:
- void Widget::on_pushButton_clicked()
- {
- QSqlQueryModel *model = new QSqlQueryModel;
- model->setQuery(“select * from student”);
- model->setHeaderData(0, Qt::Horizontal, tr(“id”));
- model->setHeaderData(1, Qt::Horizontal, tr(“name”));
- QTableView *view = new QTableView;
- view->setModel(model);
- view->show();
- QSqlQuery query = model->query();
- query.exec(“insert into student values (20,’yafei20′)”);
- //插入一條記錄
- model->setQuery(“select * from student”); //再次查詢整張表
- view->show(); //再次進(jìn)行顯示,這句也可以不寫
- }
這時(shí)運(yùn)行程序,效果如下
可以看到,這時(shí)已經(jīng)將新添的記錄顯示出來(lái)了。
小結(jié):Qt數(shù)據(jù)庫(kù) QSqlQueryModel實(shí)例操作 上篇的內(nèi)容介紹完了,想要更深入了解的話,請(qǐng)參考 Qt數(shù)據(jù)庫(kù) QSqlQueryModel實(shí)例操作 下篇。希望本節(jié)內(nèi)容能夠幫你解決問(wèn)題!