[Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel
生活随笔
收集整理的這篇文章主要介紹了
[Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[Qt教程]?第24篇 數據庫(四)SQL查詢模型QSqlQueryModel
??|?查看: 869|?回復: 1| SQL查詢模型QSqlQueryModel 版權聲明 該文章原創于作者yafeilinux,轉載請注明出處! 導語 在上一篇的最后我們講到,Qt中使用了自己的機制來避免使用SQL語句,為我們提供了更簡單的數據庫操作及數據顯示模型,分別是只讀的QSqlQueryModel,操作單表的QSqlTableModel和以及可以支持外鍵的QSqlRelationalTableModel。這次我們先講解QSqlQueryModel。 環境:Windows Xp + Qt 4.8.4+Qt Creator2.6.2 目錄 一、簡單的查詢操作 二、QSqlQueryModel常用操作 三、創建自定義QSqlQueryModel 正文 一、簡單的查詢操作 1.新建Qt Gui應用,項目名稱為queryModel,基類為QMainWindow,類名為MainWindow。 2.完成后打開queryModel.pro,將第一行代碼更改為: QT? ?? ??+= core gui sql 然后保存該文件。 3.往項目中添加新的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 primary key, namevchar)"); ? ??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?// CONNECTION_H 這里使用了db.setDatabaseName("database.db");,我們沒有再使用以前的內存數據庫,而是使用了真實的文件,這樣后面對數據庫進行的操作就能保存下來了。 4.然后進入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(); } 5.下面進入設計模式,向界面上拖入一個Push Button按鈕,更改顯示文本為“查詢”,然后進入其單擊信號槽,更改如下: void?MainWindow::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類對象model,并用setQuery()函數執行了SQL語句“("select * fromstudent");”用來查詢整個student表的內容,可以看到,該類并沒有完全避免SQL語句。然后我們設置了表中屬性顯示時的名字。最后我們建立了一個視圖view,并將這個model模型關聯到視圖中,這樣數據庫中的數據就能在窗口上的表中顯示出來了。 6.在mainwindow.cpp中添加頭文件包含: #include?<QSqlQueryModel> #include?<QTableView> 7.運行程序,按下查詢按鈕,效果如下圖所示。 8.我們查看一下編譯生成的目錄(我這里是E:\queryModel-build-桌面-Debug),這里面有生成的數據庫文件,如下圖所示。 二、QSqlQueryModel常用操作 1.在查詢按鈕槽中繼續添加如下代碼: int?column= model->columnCount(); //獲得列數 int?row = model->rowCount();? ? //?獲得行數 QSqlRecord?record = model->record(1); //獲得一條記錄 QModelIndex?index = model->index(1,1);? ?//獲得一條記錄的一個屬性的值 qDebug() << "column numis:" << column << endl ? ?? ???<<?"row num is:"?<<?row << endl ? ?? ???<<"the second record is:"?<<?record << endl ? ?? ???<<?"the data of index(1,1) is:"<<?index.data(); 2.然后在mainwindow.cpp文件中添加下面的頭文件包含: #include?<QSqlRecord> #include?<QModelIndex> #include?<QDebug> 3.運行程序,點擊查詢按鈕,輸出內容如下圖所示。 4.另外我們可以直接使用上一節講到的QSqlQuery來執行SQL語句,例如: QSqlQuery?query = model->query(); query.exec("select name from studentwhere id = 2 "); query.next(); qDebug() << query.value(0).toString(); 5.我們將查詢按鈕槽更改如下: void?MainWindow::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("insertinto student values (10,'yafei10')"); } 這里使用query向表中添加了一條記錄。 6.在mainwindow.cpp中添加頭文件#include?<QSqlQuery>,然后運行程序,發現最后添加的記錄并沒有顯示出來,當關閉程序,再次運行的時候才顯示出來,效果如下圖所示。 7.為什么會出現上面的情況呢?那是因為前面我們執行了添加記錄的SQL語句,但是在添加記錄之前,查詢結果就已經顯示了,所以我們的更新沒能動態的顯示出來。為了能讓其動態地顯示我們的更新,可以將槽最后的代碼更改如下: QSqlQuery?query?=?model->query(); query.exec("insert into student values (20,'yafei20')"); model->setQuery("select * from student");?//再次查詢整張表 view->show();?//再次進行顯示 這里我們修改完表以后,再次進行了查詢并顯示。大家可以運行程序,發現新的記錄可以直接顯示出來了。 三、創建自定義QSqlQueryModel 前面我們講到這個模型默認是只讀的,所以在窗口上并不能對表格中的內容進行修改。但是我們可以創建自己的模型,然后按照自己的意愿來顯示數據和修改數據。要想使其可讀寫,需要自己的類繼承自QSqlQueryModel,并且重寫setData() 和 flags() 兩個函數。如果我們要改變數據的顯示,就要重寫data() 函數。 下面的例子中我們讓student表查詢結果的id屬性列顯示紅色,name屬性列可編輯。 1.向項目中添加新的C++類,類名為MySqlQueryModel,基類為QSqlQueryModel,類型信息選擇“繼承自QObject”。 2.完成后打開mysqlquerymodel.h文件,在public中添加函數聲明: Qt::ItemFlags?flags(const?QModelIndex?&index) const; bool?setData(const?QModelIndex?&index, const QVariant &value, int role); QVariant?data(const?QModelIndex?&item, int role=Qt::DisplayRole) const; 然后添加私有函數聲明: private: ? ??bool?setName(int?studentId, const QString &name); ? ??void?refresh(); 3.到mysqlquerymodel.cpp文件中,更改如下: #include?"mysqlquerymodel.h" #include?<QSqlQuery> #include?<QColor> MySqlQueryModel::MySqlQueryModel(QObject?*parent)?: ? ??QSqlQueryModel(parent) { } Qt::ItemFlags?MySqlQueryModel::flags( ? ?? ??const?QModelIndex?&index)?const?//返回表格是否可更改的標志 { ? ??Qt::ItemFlags?flags?=?QSqlQueryModel::flags(index); ? ??if?(index.column()?==?1)?//第二個屬性可更改 ? ?? ??flags?|=?Qt::ItemIsEditable; ? ??return?flags; } bool?MySqlQueryModel::setData(const?QModelIndex?&index,?const?QVariant?&value,?int?/* role */) ? ?? ??//添加數據 { ? ??if?(index.column()?<?1?||?index.column()?>?2) ? ?? ??return?false; ? ?QModelIndex?primaryKeyIndex?=?QSqlQueryModel::index(index.row(), 0); ? ??int?id?=?data(primaryKeyIndex).toInt();?//獲取id號 ? ??clear(); ? ??bool?ok; ? ??if?(index.column()?==?1)?//第二個屬性可更改 ? ?? ??ok?=?setName(id,?value.toString()); ? ??refresh(); ? ??return?ok; } void?MySqlQueryModel::refresh()?//更新顯示 { ? ??setQuery("select * from student"); ? ??setHeaderData(0,?Qt::Horizontal,?QObject::tr("id")); ? ??setHeaderData(1,?Qt::Horizontal,?QObject::tr("name")); } //添加name屬性的值 bool?MySqlQueryModel::setName(int?studentId,?const?QString?&name) { ? ??QSqlQuery?query; ? ??query.prepare("update student set name = ? where id = ?"); ? ??query.addBindValue(name); ? ??query.addBindValue(studentId); ? ??return?query.exec(); } //更改數據顯示樣式 QVariant?MySqlQueryModel::data(const?QModelIndex?&index,?int?role)?const { QVariant value = QSqlQueryModel::data(index, role); //第一個屬性的字體顏色為紅色 ? ??if?(role?==?Qt::TextColorRole?&&?index.column()?==?0) ? ?? ??return?qVariantFromValue(QColor(Qt::red));? ? return value; } 4.到mainwindow.cpp文件中先添加頭文件包含: #include?"mysqlquerymodel.h" 5.更改查詢按鈕槽內容如下: void?MainWindow::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(); ? ? //創建自己模型的對象 MySqlQueryModel *myModel = new MySqlQueryModel;? ? myModel->setQuery("select * from student"); ? ??myModel->setHeaderData(0,?Qt::Horizontal,?tr("id")); ? ??myModel->setHeaderData(1,?Qt::Horizontal,?tr("name")); ? ??QTableView?*view1?=?new?QTableView; ? ??view1->setWindowTitle("mySqlQueryModel");?//修改窗口標題 ? ??view1->setModel(myModel); ? ??view1->show(); } 運行程序,效果如下圖所示。 結語 本節講解了QSqlQueryModel的相關內容,該類默認是一個只讀的SQL語句查詢模型,不過可以對其進行重寫來實現編輯功能。下一節我們將講解封裝更好的QSqlTableModel模型,它已經基本上擺脫了SQL語句。 涉及到的源碼:??queryModel.zip???? |
總結
以上是生活随笔為你收集整理的[Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Qt教程] 第25篇 数据库(五)SQ
- 下一篇: JAVA线程的interrupt