




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第6章 Qt應用程序開發6.1 Qt4程序設計基礎6.2 Qt Designer應用6.3 QMainWindow、QDialog、Layout6.4 Qt4數據庫應用6.5 Qt4多線程應用6.6 Qt4定時器6.7 Qt4事件處理6.8 Qt4網絡編程6.9 QSS樣式設計6.10 QGraphics View應用6.11 自定義控件 6.3 Qt4 數據庫應用Qt4連接數據庫過程Qt4與MySQL數據庫的連接Qt4與SQLite數據庫的連接對數據庫的操作-SQL語句Qt4中SQL模型#includeQt4中提供了QtSql模塊。為訪問數據庫提供了平臺和相應的接口提供模型視圖體系,來完成可
2、視化的信息輸入必須在.pro文件中加上:Qt += sqlQt4連接數據庫過程Qt SQL模塊中連接并處理數據庫被分成三個層次。第一層是數據庫的驅動程序。第二層是數據庫的連接層。實現對數據庫的連接,對數據庫操作結果、錯誤信息的進行處理。第三層是用戶接口層。提供了一套模型視圖體系來完成對數據庫的可視化操作。Qt4連接數據庫過程Qt4中為多種數據庫提供了本地驅動程序,見下表:DriverDatabaseQDB2IBM DB2 version7.1 and laterQIBASEBorland InterBaseQMYSQLMySQLQOCIOracle(Oracle Call Interface)
3、QODBCODBC(includes Microsoft SQL server)QPSQLPostgreSQL version 6.x and 7.xQSQLITESQLite version 3 and laterQSQLITE2SQLite version 2QTDSSybase Adaptive ServerQt4連接數據庫過程 6.3 Qt4 數據庫應用Qt4連接數據庫過程Qt4與MySQL數據庫的連接Qt4與SQLite數據庫的連接對數據庫的操作-SQL語句Qt4中SQL模型#include 用QSqlDatabase類通過驅動程序建立起和數據庫的連接設置hostName,datab
4、aseName,username,password等屬性打開數據庫操作數據庫關閉數據庫Qt4與MySQL數據庫的連接QSqlDatabase db = QSqlDatabase:addDatabase(“QMYSQL”);db.setHostName(“localhsot”);db.setDatabaseName(“testmysql.db”);db.setUserName(“user”);db.setPassword(“password”);if(!db.open())QMessageBox:critical(0,cannot open database,Unabel to connect,
5、QMessageBox:Cancel); Qt4與MySQL數據庫的連接 6.3 Qt4 數據庫應用Qt4連接數據庫過程Qt4與MySQL數據庫的連接Qt4與SQLite3數據庫的連接對數據庫的操作-SQL語句Qt4中SQL模型SQLite的驅動程序是QSQLITE。SQLITE數據庫不是基于服務器的,不需要設置username,password等屬性,只要制定databaseName就可以了。QSqlDatabase db = QSqlDatabase:addDatabase(“QSQLITE”);db.setDatabaseName(“testsqlite.db”);if(!db.open
6、())QMessageBox:critical(0,cannot open database,Unabel to connect,QMessageBox:Cancel);Qt4與SQLite3數據庫的連接SQLite數據庫的一個優良特性是它可以在內存中建立,操作快,省去了對磁盤的讀寫。把數據庫保留在內存中,可以通過這樣的代碼來實現:db.setDatabaseName(“:memory:”);結束對數據庫的操作,用close方法來實現關閉數據庫。Qt4與SQLite3數據庫的連接 6.3 Qt4 數據庫應用Qt4連接數據庫過程Qt4與MySQL數據庫的連接Qt4與SQLite數據庫的連接對數據
7、庫的操作-SQL語句Qt4中SQL模型用QSqlQuery對象來執行SQL命令來對數據庫操作。 QSqlQuery類中提供了多個函數來操作結果集。QSqlQuery query;query.exec(“SELECT * FROM teacher”);exec()方法執行之后,能夠獲得相應的執行結果集,集合記錄從0開始編號。first():指向結果集的第一條記錄。last():指向結果集的最后一條記錄。next():指向下一條記錄,每執行一次便指向相鄰的下一條記錄。previous():指向上一條記錄,每執行一次便指向相鄰的上一條記錄seek(int n):指向結果集第n條記錄。record()
8、:獲得現在指向的記錄。對數據庫的操作-SQL語句通過next()方法來指定結果集的第一條記錄,依次訪問后續的記錄,直到最后一條記錄,next()方法返回false。如果查詢失敗或者查詢的結果集為空,那么next()返回值也為false。while(query.next() /獲取query所指向的記錄在結果集中的編號 qDebug(rowNum is:%d,query.at();/獲取id屬性的值,并轉換成int型 qDebug(id is:%d,query.value(0).toInt(); 對數據庫的操作-SQL語句在SQL語句中使用變量prepare()函數,利用”:id”和”:name
9、”代替具體的數據bindValue()函數給id,name賦值,為綁定操作,可以將用編號或實際的字段名代替。如: query.prepare(insert into student(id,name) values(:id,:name); query.bindValue(:id,4); query.bindValue(:name,stu4); query.exec();對數據庫的操作-SQL語句當要進行多條記錄的操作時,可以利用綁定進行批操作 QSqlQuery query; QVariantList ints; QVariantList names; query.prepare(insert
10、into student values(?,?); ints56; namesstu5stu6”; query.addBindValue(ints); query.addBindValue(names); query.execBatch();對數據庫的操作-SQL語句 6.3 Qt4 數據庫應用Qt4連接數據庫過程Qt4與MySQL數據庫的連接Qt4與SQLite數據庫的連接對數據庫的操作-SQL語句Qt4中SQL模型Qt中提供了模型類和模型/視圖框架,使用這些模型,用戶設置完成對數據庫的SQL語句,自動的向視圖表中添加數據,可視化的操作數據庫。Qt提供了三種SQL模型。(1)QSqlQuer
11、yModel:為SELECT SQL語句結果集提供只讀數據模型(2)QSqlTabelModel:為單個數據庫表提供可編輯的數據模型。(3)QSqlRelationModel:為單個數據庫表提供可編輯的數據模型,同時可以和其他數據庫表產生關聯。Qt4中SQL模型QSqlQueryModelQSqlQueryModel 模型創建一個實例對象,用setQuery方法設定查詢條件,把查詢的結果通過一個視圖(QTableView)表顯示出來。#include#includeQSqlQueryModel *model = new QSqlQueryModel();model-setQuery(“SELE
12、CT ID, name FROM teacher”);QTableView *view = new QTableView();view-setModel(model);view-show(); QSqlQueryModel例子static bool createtable() QSqlQuery query; query.exec(create table student (id integer primary key,name varchar(10); query.exec(insert into student values(1,stu1); query.exec(insert into
13、student values(2,stu2); query.exec(insert into student values(3,stu3); return true;QSqlQueryModel例子static bool createconnect() QSqlDatabase db =QSqlDatabase:addDatabase(QSQLITE); db.setDatabaseName(test.db); if(!db.open() QMessageBox:critical(0,cannot open database,Unabel to connect,QMessageBox:Canc
14、el); return false; createtable(); return true;QSqlQueryModel例子int main(int argc, char *argv) QApplication a(argc, argv); createconnect(); Widget w; w.show(); return a.exec();QSqlQueryModel例子Widget:Widget(QWidget *parent) : QWidget(parent), ui(new Ui:Widget) ui-setupUi(this); Initdata();void Widget:I
15、nitdata() this-model = new QSqlQueryModel(0); this-model-setQuery(select * from student); this-model-setHeaderData(0,Qt:Horizontal,tr(id); this-model-setHeaderData(1,Qt:Horizontal,tr(name); this-ui-tableView-setModel(model); this-ui-tableView-show();QSqlTableModel為單個數據庫表提供可編輯的數據模型。常用功能:修改、插入、刪除、查詢和排
16、序使用該類可以完全脫離SQL語句。包括頭文件#includeQSqlTableModel初始化QSqlTableModelQSqlTableModel *model=new QSqlTableModel(); model=new QSqlTableModel(); model-setTable(appliance); model-setEditStrategy(QSqlTableModel:OnManualSubmit); model-select(); ui-tableView-setModel(model);QSqlTableModel-增加操作model-setEditStrategy(
17、QSqlTableModel:OnManualSubmit);上述表示手動修改提交之后,才能生效。例子:增加一條空記錄void Widget:on_Button_add_clicked() int row=this-model-rowCount(); this-model-insertRow(row);void Widget:on_Button_Edit_clicked() this-model-database().transaction(); int ok = QMessageBox:question(this,tr(提示),tr(確定修改嗎?),QMessageBox:Yes|QMess
18、ageBox:No); if(ok = QMessageBox:Yes) this-model-submitAll(); this-model-revertAll();QSqlTableModel-修改操作QSqlTableModel-修改操作submitAll()表示提交所有待定的操作。revertAll()表示恢復/撤銷所有待定的操作。如果出現中文亂碼的情況,解決方法為:在main()函數中加入QTextCodec:setCodecForTr(QTextCodec:codecForName(“GB18030”);需要包含頭文件#includeQTextCodecQSqlTableModel
19、-修改操作QSqlTabelModel模型可以將所有修改先保存到model中,只有當執行事務操作的model-database().commit()后,才會真正寫入數據庫。需要在QSqlTableModel初始化時,設定model-setEditStrategy(QSqlTableModel:OnManualSubmit); OnManualSubmit 表明我們要提交修改才能使其生效。QSqlTableModel-刪除操作void Widget:on_Button_delete_clicked()int currentRow = ui-tableView-currentIndex().row
20、(); /獲取選中的行 this-model-removeRow(currentRow); /刪除該行 int ok = QMessageBox:warning(this,tr(Delete?),tr(確認刪除?),QMessageBox:Yes|QMessageBox:No); if(ok = QMessageBox:Yes) this-model-submitAll();/提交并刪除數據庫中該記錄 else this-model-revertAll();/撤銷該操作QSqlTableModel-查詢操作/點擊查詢按鈕,按照編輯框的內容進行模塊查詢void Widget:on_Button_
21、select_clicked() QString applianceName = ui-Edit_search-text();/根據姓名進行查詢 this-model-setFilter(tr(name=%1).arg(applianceName); this-model-select(); ui-tableView-setModel(this-model);QSqlTableModel-排序操作使用setSort()函數進行排序,它有兩個參數,第一個參數表示按第幾個屬性排序,表頭從左向右,最左邊是第0個屬性(eg:id);第二個參數是排序方法,有升序和降序兩種。代碼示例:void Table
22、Model:on_pushButton_5_clicked()model-setSort(0,Qt:AscendingOrder); /id屬性,即第0列,升序排列model-select();/降序排列如下:model-setSort(0,Qt:DescendingOrder);QSqlTableModelQSqlTableModel與QSqlQueryModel的區別與聯系:1.QSqlQueryModel中的操作在QSqlTableModel中可以同樣執行;2.完全脫離了SQL語句,就算你不怎么懂數據庫,也可以利用它進行大部分常用的操作;3.這個模型提供了緩沖區,可以先將修改保存起來,當我們執行提交函數時,再去真正地修改數據庫。QSqlRelationTableModel QSqlRela
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個性化學習方案制定計劃
- 2025年中學教師資格考試《綜合素質》教育研究方法教育管理應用題(含答案)試卷
- 主管工作計劃的效果評估
- 啟蒙哲學教育教學安排計劃
- 優化供應鏈管理與生產計劃的關系
- 餐廳煤氣供氣安全協議書
- 短期投資合作合同范本
- 舞臺安裝合作合同范本
- 電梯消防安全合同范本
- 雇傭客車合作經營協議書
- 2023年一般行業安全負責人和安全員考試題庫
- 《水電水利工程施工監理規范》
- 汽車租賃服務投標方案(技術方案2)
- 工作場所有害因素職業接觸限值-第2部分-物理因素
- 期末模擬試卷(試題)-2023-2024學年三年級下冊數學人教版
- 普通家庭裝修預算表(全面細致)
- 畜牧業的動物福利與保護
- 售后常見問題以及處理方法分解課件
- 汽車線控底盤技術
- 橋梁工程施工現場監測方案
- 事態升級管理程序
評論
0/150
提交評論