![第13章 Qt 5數(shù)據(jù)庫_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/1/65572618-82be-447a-ab75-798174d053c9/65572618-82be-447a-ab75-798174d053c91.gif)
![第13章 Qt 5數(shù)據(jù)庫_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/1/65572618-82be-447a-ab75-798174d053c9/65572618-82be-447a-ab75-798174d053c92.gif)
![第13章 Qt 5數(shù)據(jù)庫_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/1/65572618-82be-447a-ab75-798174d053c9/65572618-82be-447a-ab75-798174d053c93.gif)
![第13章 Qt 5數(shù)據(jù)庫_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/1/65572618-82be-447a-ab75-798174d053c9/65572618-82be-447a-ab75-798174d053c94.gif)
![第13章 Qt 5數(shù)據(jù)庫_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/1/65572618-82be-447a-ab75-798174d053c9/65572618-82be-447a-ab75-798174d053c95.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第13章 Qt 5數(shù)據(jù)庫數(shù)據(jù)庫基本概念數(shù)據(jù)庫基本概念13.113.2常用常用SQL命令命令Qt操作數(shù)據(jù)庫及實例操作數(shù)據(jù)庫及實例13.313.1 數(shù)據(jù)庫基本概念數(shù)據(jù)庫基本概念1數(shù)據(jù)和數(shù)據(jù)庫(數(shù)據(jù)和數(shù)據(jù)庫(DB)利用計算機(jī)進(jìn)行數(shù)據(jù)處理,首先需要將信息以數(shù)據(jù)形式存儲到計算機(jī)中,因為數(shù)據(jù)是可以被計算機(jī)接收和處理的符號。根據(jù)所表示的信息特征不同,數(shù)據(jù)有不同的類別,如數(shù)字、文字、表格、圖形/圖像和聲音等。數(shù)據(jù)庫(DataBase,DB),顧名思義,就是存放數(shù)據(jù)的倉庫,其特點是數(shù)據(jù)按照數(shù)據(jù)模型組織,是高度結(jié)構(gòu)化的,可供多個用戶共享并且具有一定的安全性。2數(shù)據(jù)庫管理系統(tǒng)(數(shù)據(jù)庫管理系統(tǒng)(DBMS)數(shù)據(jù)庫管理系
2、統(tǒng)即DBMS(DataBase Management System),它是位于用戶應(yīng)用程序和操作系統(tǒng)之間的數(shù)據(jù)庫管理系統(tǒng)軟件,其主要功能是組織、存儲和管理數(shù)據(jù),高效地訪問和維護(hù)數(shù)據(jù),即提供數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)控制和數(shù)據(jù)維護(hù)等功能。常用的數(shù)據(jù)庫管理系統(tǒng)有Oracle、Microsoft SQL Server和MySQL等。數(shù)據(jù)庫系統(tǒng)即DBS(DataBase System),是指按照數(shù)據(jù)庫方式存儲和維護(hù)數(shù)據(jù),并向應(yīng)用程序提供數(shù)據(jù)訪問接口的系統(tǒng)。DBS通常由數(shù)據(jù)庫、計算機(jī)硬件(支持DB存儲和訪問)、軟件(包括操作系統(tǒng)、DBMS及應(yīng)用開發(fā)支撐軟件)和數(shù)據(jù)庫管理員(DataBase Adminis
3、trator,DBA)四個部分組成。其中,DBA是控制數(shù)據(jù)整體結(jié)構(gòu)的人,負(fù)責(zé)數(shù)據(jù)庫系統(tǒng)的正常運行,承擔(dān)創(chuàng)建、監(jiān)控和維護(hù)整個數(shù)據(jù)庫結(jié)構(gòu)的責(zé)任。13.1 數(shù)據(jù)庫基本概念數(shù)據(jù)庫基本概念3結(jié)構(gòu)化查詢語言結(jié)構(gòu)化查詢語言SQL結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)是用于關(guān)系數(shù)據(jù)庫操作的標(biāo)準(zhǔn)語言,最早由Boyce和Chambedin在1974年提出,稱為SEQUEL語言。目前,許多關(guān)系型數(shù)據(jù)庫供應(yīng)商都在自己的數(shù)據(jù)庫中支持SQL語言,如Access、MySQL、Oracle和Microsoft SQL Server等,其中大部分?jǐn)?shù)據(jù)庫遵守的是SQL-89標(biāo)準(zhǔn)。SQL語言由
4、以下三部分組成。(1)數(shù)據(jù)定義語言(Data Description Language,DDL),用于執(zhí)行數(shù)據(jù)庫定義的任務(wù),對數(shù)據(jù)庫及數(shù)據(jù)庫中的各種對象進(jìn)行創(chuàng)建、刪除和修改等操作。數(shù)據(jù)庫對象主要包括表、默認(rèn)約束、規(guī)則、視圖、觸發(fā)器和存儲過程等。(2)數(shù)據(jù)操縱語言(Data Manipulation Language,DML),用于操縱數(shù)據(jù)庫中各種對象,檢索和修改數(shù)據(jù)。(3)數(shù)據(jù)控制語言(Data Control Language,DCL),用于安全管理,確定哪些用戶可以查看或修改數(shù)據(jù)庫中的數(shù)據(jù)。13.1 數(shù)據(jù)庫基本概念數(shù)據(jù)庫基本概念4表和視圖表和視圖(1)表()表(Table)。)。表是在日常
5、工作和生活中經(jīng)常使用的一種表示數(shù)據(jù)及其關(guān)系的形式,如表13.1為一個學(xué)生表。學(xué) 號姓 名專 業(yè) 名性 別出 生 時 間150201王 一計算機(jī)男1996/10/01150202王 巍計算機(jī)女1997/02/08150302林 滔電子工程男1996/04/06150303江為中電子工程男1999/12/0813.1 數(shù)據(jù)庫基本概念數(shù)據(jù)庫基本概念下面是表的定義。 表結(jié)構(gòu)表結(jié)構(gòu)每個數(shù)據(jù)庫包含若干個表。每個表具有一定的結(jié)構(gòu),稱為表的“型”。所謂表型是指組成表的各列的名稱及數(shù)據(jù)類型,也就是日常表格的“欄目信息”。 記錄記錄每個表包含若干行數(shù)據(jù),它們是表的“值”,表中的一行稱為一個記錄(Record)。因
6、此,表是記錄的有限集合。 字段字段每個記錄由若干個數(shù)據(jù)項構(gòu)成,將構(gòu)成記錄的每個數(shù)據(jù)項稱為字段(Field)。字段包含的屬性有字段名、字段數(shù)據(jù)類型、字段長度及是否為關(guān)鍵字等。 關(guān)鍵字關(guān)鍵字在學(xué)生表中,若不加以限制,則每條記錄的姓名、專業(yè)、性別和出生時間這四個字段的值都有可能相同,但是學(xué)號字段的值對表中所有記錄來說則一定不同,即通過“學(xué)號”字段可以將表中的不同記錄區(qū)分開來。13.1 數(shù)據(jù)庫基本概念數(shù)據(jù)庫基本概念(2)視圖()視圖(View)。)。視圖是從一個或多個表(或視圖)導(dǎo)出的表。視圖與表不同,它是一個虛表,即視圖所對應(yīng)的數(shù)據(jù)不進(jìn)行實際存儲,數(shù)據(jù)庫中只存儲視圖的定義,對視圖的數(shù)據(jù)進(jìn)行操作時,系
7、統(tǒng)根據(jù)視圖的定義操作與視圖相關(guān)聯(lián)的基本表。視圖一經(jīng)定義后,就可以像表一樣被查詢、修改、刪除和更新。使用視圖具有便于數(shù)據(jù)共享、簡化用戶權(quán)限管理和屏蔽數(shù)據(jù)庫的復(fù)雜性等優(yōu)點。13.2 常用常用SQL命令命令13.2.1 數(shù)據(jù)查詢數(shù)據(jù)查詢1SELECT語句語句完備的SELECT語句很復(fù)雜,它主要的子句如下:SELECT DISTINCT 別名.字段名或表達(dá)式 AS 列標(biāo)題/* 指定要選擇的列或行及其限定 */(a)FROM table_source /* FROM子句,指定表或視圖 */ WHERE search_condition /* WHERE子句,指定查詢條件 */(b) GROUP BY g
8、roup_by_expression /* GROUP BY子句,指定分組表達(dá)式 */ ORDER BY order_expression ASC | DESC /* ORDER BY子句,指定排序表達(dá)式和順序 */(c)13.2.1 數(shù)據(jù)查詢(1)查詢Student數(shù)據(jù)庫。查詢students表中各個同學(xué)的姓名和總學(xué)分。USE Student SELECT name,totalscore FROM students(2)查詢表中所有記錄。查詢students表中各個同學(xué)的所有信息。SELECT * FROM students(3)條件查詢。查詢students表中總學(xué)分大于等于120的同學(xué)的
9、情況。SELECT * FROM students WHERE totalscore = 120(4)多重條件查詢。查詢students表中所在系為“計算機(jī)”且總學(xué)分大于等于120的同學(xué)的情況。SELECT * FROM students WHERE department=計算機(jī) AND totalscore = 120(5)使用LIKE謂詞進(jìn)行模式匹配。查詢students表中姓“王”且單名的學(xué)生情況。SELECT * FROM students WHERE name LIKE 王_13.2.1 數(shù)據(jù)查詢(6)用BETWEENAND指定查詢范圍。查詢students表中不在1997年出生的學(xué)
10、生情況。SELECT * FROM students WHERE birthday NOT BETWEEN 1997-1-1 and 1997-12-31(7)空值比較。查詢總學(xué)分尚不確定的學(xué)生情況。SELECT * FROM students WHERE totalscore IS NULL(8)自然連接查詢。查找計算機(jī)系學(xué)生姓名及其“C程序設(shè)計”課程的考試分?jǐn)?shù)情況。SLELCT name,grade FROM students, courses,grades, WHERE department = 計算機(jī) AND coursename= C程序設(shè)計 AND students.student
11、id = grades.studentid AND courses.courseid = grades.coursesid13.2.1 數(shù)據(jù)查詢(9)IN子查詢。查找選修了課程號為101的學(xué)生情況。SELECT * FROM studentsWHERE studentid IN ( SELECT studentid FROM courses WHERE courseid = 101 )在執(zhí)行包含子查詢的SELECT語句時,系統(tǒng)首先執(zhí)行子查詢,產(chǎn)生一個結(jié)果表,再執(zhí)行外查詢。本例中,首先執(zhí)行子查詢:SELECT studentid FROM courses, students,grades WHE
12、RE courseid = 101 AND students.studentid = grades.studentid AND courses.courseid = grades.coursesid13.2.1 數(shù)據(jù)查詢(10)比較子查詢。這種子查詢可以認(rèn)為是IN子查詢的擴(kuò)展,它是表達(dá)式的值與子查詢的結(jié)果進(jìn)行比較運算。查找課程號206的成績不低于課程號101的最低成績的學(xué)生學(xué)號。SELECT studentid FROM grades WHERE courseid = 206 AND grade ! ANY ( SELECT grade FROM grades WHERE courseid =
13、 101 )(11)EXISTS子查詢。EXISTS謂詞用于測試子查詢的結(jié)果是否為空表,若子查詢的結(jié)果集不為空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結(jié)合使用,即NOT EXISTS,其返回值與EXISTS剛好相反。查找選修206號課程的學(xué)生姓名。 SELECT name FROM students WHERE EXISTS ( SELECT * FROM grades WHERE studentid = students.studentid AND courseid = 206 )13.2.1 數(shù)據(jù)查詢(12)查找選修了全部課程的同學(xué)姓名(即查找沒有一門功課
14、不選修的學(xué)生)。SELECT name FROM students WHERE NOT EXISTS ( SELECT * FROM courses WHERE NOT EXISTS ( SELECT * FROM grades WHERE studentid= students.studentid AND courseid=courses.courseid ) )(13)查詢結(jié)果分組。將各課程成績按學(xué)號分組。SELECT studentid,grade FROM grades GROUP BY studentid(14)查詢結(jié)果排序。將計算機(jī)系的學(xué)生按出生時間先后排序。SELECT * FR
15、OM students WHERE department = 計算機(jī) ORDER BY birthday13.2.1 數(shù)據(jù)查詢2常用聚合函數(shù)常用聚合函數(shù)對表數(shù)據(jù)進(jìn)行檢索時,經(jīng)常需要對結(jié)果進(jìn)行匯總或計算,如在學(xué)生成績數(shù)據(jù)庫中求某門功課的總成績、統(tǒng)計各分?jǐn)?shù)段的人數(shù)等。聚合函數(shù)用于計算表中的數(shù)據(jù),返回單個計算結(jié)果。常用的聚合函數(shù)列于表13.2中。函 數(shù) 名說 明AVG求組中值的平均值COUNT求組中項數(shù),返回int類型整數(shù)MAX求最大值MIN求最小值SUM返回表達(dá)式中所有值的和VAR返回給定表達(dá)式中所有值的統(tǒng)計方差13.2.1 數(shù)據(jù)查詢本例對Students數(shù)據(jù)庫表執(zhí)行查詢,使用常用的聚合函數(shù)。(1
16、)求選修101課程學(xué)生的平均成績。SELECT AVG(grade) AS 課程101平均成績 FROM grades WHERE courseid = 101(2)求選修101課程學(xué)生的最高分和最低分。SELECT MAX(grade) AS 課程101最高分 , MIN(grade) AS 課程101最低分 FROM grades WHERE courseid = 101 (3)求學(xué)生的總?cè)藬?shù)。SELECT COUNT(*) AS 學(xué)生總數(shù) FROM students13.2.2 數(shù)據(jù)操作1插入數(shù)據(jù)語句插入數(shù)據(jù)語句INSERTINSERT可添加一條或多條記錄至一個表中。INSERT有兩種語
17、法形式。語法語法1:INSERT INTO target IN externaldatabase (fields_list)/(a)DEFAULT VALUES|VALUES(DEFAULT|expression_list)/(b)語法語法2:INSERT INTO target IN externaldatabase fields_listSELECT|EXECUTE13.2.2 數(shù)據(jù)操作2刪除數(shù)據(jù)語句刪除數(shù)據(jù)語句DELETEDELETE用于從一個或多個表中刪除記錄。DELETE語句的語法格式如下:DELETE FROM table_namesWHERE例如,例如,用以下語句從student
18、s表中刪除姓名為“羅亮”的記錄:DELETE FROM students WHERE name = 羅亮13.2.2 數(shù)據(jù)操作3更新數(shù)據(jù)語句更新數(shù)據(jù)語句UPDATEUPDATE語句用于更新表中的記錄。UPDATE語句的語法格式如下:UPDATE table_nameSET Field_1=expression_1,Field_2=expression_2FROM table1_name|view1_name,table2_name|view2_nameWHERE其中,其中,F(xiàn)ield是需要更新的字段,expression表示要更新字段的新值表達(dá)式。例如,例如,以下語句將計算機(jī)系學(xué)生的總分增加1
19、0:UPDATE studentsSET totalscore = totalscore +10WHERE department = 計算機(jī)13.3 Qt操作數(shù)據(jù)庫及實例操作數(shù)據(jù)庫及實例Qt提供的QtSql模塊實現(xiàn)了對數(shù)據(jù)庫的訪問,同時提供了一套與平臺和具體所用數(shù)據(jù)庫均無關(guān)的調(diào)用接口。除此之外,此模型還支持常用的數(shù)據(jù)庫模式,如主從視圖(master-detail views)和向下鉆?。╠rill-down)模式。這個模塊由不同Qt類支撐的三部分組成,具體QtSql模塊層次結(jié)構(gòu)見表13.3。層 次描 述驅(qū)動層實現(xiàn)了特定數(shù)據(jù)庫與SQL接口的底層橋接,包括的支持類有QSqlDriver、QSqlD
20、riverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin和QSqlResultSQL接口層QSqlDatabase類提供了數(shù)據(jù)庫訪問類、數(shù)據(jù)庫連接操作,QSqlQuery類提供了與數(shù)據(jù)庫的交互操作,其他支持類還包括QSqlError、QSqlField、QSqlTableModel和QSqlRecord用戶接口層提供從數(shù)據(jù)庫數(shù)據(jù)到用于數(shù)據(jù)表示的窗體的映射,包括的支持類有QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel,這些類均依據(jù)Qt的模型/視圖結(jié)構(gòu)設(shè)計13.3.1 Qt操作SQLite數(shù)
21、據(jù)庫Qt提供了一種進(jìn)程內(nèi)數(shù)據(jù)庫SQLite。它小巧靈活,無須額外安裝配置且支持大部分ANSI SQL92標(biāo)準(zhǔn),是一個輕量級的數(shù)據(jù)庫,概括起來具有以下優(yōu)點。(1)SQLite的設(shè)計目的是嵌入式SQL數(shù)據(jù)庫引擎,它基于純C語言代碼,已經(jīng)應(yīng)用于非常廣泛的領(lǐng)域內(nèi)。(2)SQLite在需要持久存儲時可以直接讀寫硬盤上的數(shù)據(jù)文件,在無須持久存儲時也可以將整個數(shù)據(jù)庫置于內(nèi)存中,兩者均不需要額外的服務(wù)器端進(jìn)程,即SQLite是無須獨立運行的數(shù)據(jù)庫引擎。(3)開放源代碼,整個代碼少于3萬行,有良好的注釋和90%以上的測試覆蓋率。(4)少于250KB的內(nèi)存占用(gcc編譯情況下)。(5)支持視圖、觸發(fā)器和事務(wù),支
22、持嵌套SQL功能。(6)提供虛擬機(jī)用于處理SQL語句。(7)不需要配置,不需要安裝,也不需要管理員。(8)支持大部分ANSI SQL92標(biāo)準(zhǔn)。(9)大部分應(yīng)用的速度比目前常見的客戶端/服務(wù)器結(jié)構(gòu)的數(shù)據(jù)庫快。(10)編程接口簡單易用。13.3.1 Qt操作SQLite數(shù)據(jù)庫【例】【例】(難度中等) 基于控制臺的程序,使用SQLite數(shù)據(jù)庫完成大批量數(shù)據(jù)的增加、刪除、更新和查詢操作并輸出。實例文件見光盤CH1301。具體操作步驟如下。(1)在“QSQLiteE”文件中添加如下代碼:QT += sql(2)源文件“main.cpp”的具體代碼。其中,其中,(a) QSqlDatabase
23、db =QSqlDatabase:addDatabase(QSQLITE):以“QSQLITE”為數(shù)據(jù)庫類型,在本進(jìn)程地址空間內(nèi)創(chuàng)建一個SQLite數(shù)據(jù)庫。此處涉及的知識點有以下兩點。 在進(jìn)行數(shù)據(jù)庫操作之前,必須首先建立與數(shù)據(jù)庫的連接。數(shù)據(jù)庫連接由任意字符串標(biāo)識。在沒有指定連接的情況下,QSqlDatabase可以提供默認(rèn)連接供Qt其他的SQL類使用。建立一條數(shù)據(jù)庫連接的代碼如下:QSqlDatabase db =QSqlDatabase:addDatabase(QSQLITE);db.setHostName(easybook-3313b0);/設(shè)置數(shù)據(jù)庫主機(jī)名db.setDatabaseNa
24、me(qtDB.db);/設(shè)置數(shù)據(jù)庫名db.setUserName(zhouhejun);/設(shè)置數(shù)據(jù)庫用戶名db.setPassword(123456);/設(shè)置數(shù)據(jù)庫密碼db.open();/打開連接13.3.1 Qt操作SQLite數(shù)據(jù)庫 QtSql模塊使用驅(qū)動插件(driver plugins)與不同的數(shù)據(jù)庫接口通信。由于Qt Sql模塊的應(yīng)用程序接口是與具體數(shù)據(jù)庫無關(guān)的,所以所有與數(shù)據(jù)庫相關(guān)的代碼均包含在這些驅(qū)動插件中。目前,Qt中支持的驅(qū)動插件見表13.4。驅(qū) 動數(shù)據(jù)庫管理系統(tǒng)QDB2IBM DB2及其以上版本QIBASEBorland InterBaseQMYSQLMySQLQOCI
25、Oracle Call Interface DriverQODBCOpen Database Connectivity(ODBC)包括微軟SQL Server和其他ODBC兼容數(shù)據(jù)庫QPSQLPostgreSQL版本6.x和7.xQSQLITESQLite版本3及其以上版本QSQLITE2SQLite版本2QTDSSybase Adaptive Server13.3.1 Qt操作SQLite數(shù)據(jù)庫(b) db.setDatabaseName(qtDB.db):以上創(chuàng)建的數(shù)據(jù)庫以“qtDB.db”為數(shù)據(jù)庫名。它是SQLite在建立內(nèi)存數(shù)據(jù)庫時唯一可用的名字。(c) QSqlQuery query
26、:創(chuàng)建QSqlQuery對象。QtSql模塊中的QSqlQuery類提供了一個執(zhí)行SQL語句的接口并且可以遍歷執(zhí)行的返回結(jié)果集。除QSqlQuery類之外,Qt還提供了三種用于訪問數(shù)據(jù)庫的高層類,即QSqlQueryModel、QSqlTableModel和QSqlRelationTableModel。它們無須使用SQL語句就可以進(jìn)行數(shù)據(jù)庫操作,而且可以很容易地將結(jié)果在表格中表示出來。其各自的用途見表13.5。類 名用 途QSqlQueryModel基于任意SQL語句的只讀模型QSqlTableModel基于單個表的讀寫模型QSqlRelationalTableModelQSqlTableMo
27、del的子類,增加了外鍵支持(d) bool success=query.exec(create table automobil):創(chuàng)建數(shù)據(jù)庫表“automobil”,該表具有10個字段。在執(zhí)行exec()函數(shù)調(diào)用后,就可以操作返回的結(jié)果了。13.3.1 Qt操作SQLite數(shù)據(jù)庫(e) query.prepare(insert into automobil values(?,?,?,?,?,?,?,?,?,?):如果要插入多條記錄,或者避免將值轉(zhuǎn)換為字符串(即正確地轉(zhuǎn)義),則可以首先調(diào)用prepare()函數(shù)指定一個包含占位符的query,然后綁定要插入的值。等價于使用Oracle語法的有名
28、占位符的具體形式如下:query.prepare(insert into automobile(id,attribute,type,kind,nation, carnumber,elevaltor,distance,oil,temperature) values(:id, :attribute, :type, :kind, :nation, :carnumber,:elevaltor,:distance,:oil,:temperature); long records=100; for(int i=0;irecords;i+) query.bindValue(:id,i); query.bin
29、dValue(:attribute,四輪); query.bindValue(:type,轎車); query.bindValue(:kind,富康); query.bindValue(:nation,rand()%100); query.bindValue(:carnumber,rand()%10000); query.bindValue(:elevaltor,rand()%300); query.bindValue(:distance,rand()%200000); query.bindValue(:oil,rand()%52); query.bindValue(:temperature,
30、rand()%100);13.3.1 Qt操作SQLite數(shù)據(jù)庫(f) query.bindValue(0,i):調(diào)用bindValue()或addBindValue()函數(shù)綁定要插入的值。(g) success=query.exec():調(diào)用exec()函數(shù)在query中插入對應(yīng)的值,之后,可以繼續(xù)調(diào)用bindValue()或addBindValue()函數(shù)綁定新值,然后再次調(diào)用exec()函數(shù)在query中插入新值。(h) qDebug()setEditTriggers(QAbstractItemView:NoEditTriggers);/(a) factoryView-setSortin
31、gEnabled(true); factoryView-setSelectionBehavior(QAbstractItemView:SelectRows); factoryView-setSelectionMode(QAbstractItemView:SingleSelection); factoryView-setShowGrid(false); factoryView-setAlternatingRowColors(true); QGroupBox *box = new QGroupBox(tr(汽車制造商); QGridLayout *layout = new QGridLayout;
32、 layout-addWidget(factoryView, 0, 0); box-setLayout(layout); return box;13.3.2 Qt操作主/從視圖及XMLcreateFactoryGroupBox()函數(shù)的具體內(nèi)容如下:QGroupBox* MainWindow:createFactoryGroupBox() factoryView = new QTableView; factoryView-setEditTriggers(QAbstractItemView:NoEditTriggers); /(a) factoryView-setSortingEnabled(t
33、rue); factoryView-setSelectionBehavior(QAbstractItemView:SelectRows); factoryView-setSelectionMode(QAbstractItemView:SingleSelection); factoryView-setShowGrid(false); factoryView-setAlternatingRowColors(true); QGroupBox *box = new QGroupBox(tr(汽車制造商); QGridLayout *layout = new QGridLayout; layout-ad
34、dWidget(factoryView, 0, 0); box-setLayout(layout); return box;13.3.2 Qt操作主/從視圖及XMLcreateCarGroupBox()函數(shù)的具體代碼如下:QGroupBox* MainWindow:createCarGroupBox() QGroupBox *box = new QGroupBox(tr(汽車); carView = new QTableView; carView-setEditTriggers(QAbstractItemView:NoEditTriggers); carView-setSortingEnabl
35、ed(true); carView-setSelectionBehavior(QAbstractItemView:SelectRows); carView-setSelectionMode(QAbstractItemView:SingleSelection); carView-setShowGrid(false); carView-verticalHeader()-hide(); carView-setAlternatingRowColors(true); QVBoxLayout *layout = new QVBoxLayout; layout-addWidget(carView, 0, 0
36、); box-setLayout(layout); return box;13.3.2 Qt操作主/從視圖及XMLcreateDetailsGroupBox()函數(shù)的具體代碼如下:QGroupBox* MainWindow:createDetailsGroupBox() QGroupBox *box = new QGroupBox(tr(詳細(xì)信息); profileLabel = new QLabel; profileLabel-setWordWrap(true); profileLabel-setAlignment(Qt:AlignBottom); titleLabel = new QLab
37、el; titleLabel-setWordWrap(true); titleLabel-setAlignment(Qt:AlignBottom); attribList = new QListWidget; QGridLayout *layout = new QGridLayout; layout-addWidget(profileLabel, 0, 0, 1, 2); layout-addWidget(titleLabel, 1, 0, 1, 2); layout-addWidget(attribList, 2, 0, 1, 2); layout-setRowStretch(2, 1);
38、box-setLayout(layout); return box;13.3.2 Qt操作主/從視圖及XMLcreateMenuBar()函數(shù)的具體代碼如下:void MainWindow:createMenuBar() QAction *addAction = new QAction(tr(添加), this); QAction *deleteAction = new QAction(tr(刪除), this); QAction *quitAction = new QAction(tr(退出), this); addAction-setShortcut(tr(Ctrl+A); deleteA
39、ction-setShortcut(tr(Ctrl+D); quitAction-setShortcut(tr(Ctrl+Q); QMenu *fileMenu = menuBar()-addMenu(tr(操作菜單); fileMenu-addAction(addAction); fileMenu-addAction(deleteAction); fileMenu-addSeparator(); fileMenu-addAction(quitAction);13.3.2 Qt操作主/從視圖及XML(3)此時運行結(jié)果如圖13.2所示。13.3.2 Qt操作主/從視圖及XML2連接數(shù)據(jù)庫連接數(shù)據(jù)
40、庫(1)右擊項目名,選擇“添加新文件”“Qt”“Qt設(shè)計師界面類”菜單項,如圖13.3所示,單擊“Choose.”按鈕繼續(xù)。13.3.2 Qt操作主/從視圖及XML接下來在如圖13.4所示的對話框中,模板選擇“Dialog without Buttons”,單擊“下一步”按鈕繼續(xù)。13.3.2 Qt操作主/從視圖及XML類名設(shè)置為“ConnDlg”,在“頭文件”后面的文本框中輸入“connectdlg.h”;在“源文件”后面的文本框中輸入“connectdlg.cpp”;在“界面文件”后面的文本框中輸入“connectdlg.ui”,如圖13.5所示,單擊“下一步”按鈕,單擊“完成”按鈕。13
41、.3.2 Qt操作主/從視圖及XML打開“connectdlg.ui”,單擊“Form”的空白處修改“QDialog”的“objectName: QSqlConnectionDialogUi”。最后添加如圖13.6所示的控件。13.3.2 Qt操作主/從視圖及XML各控件的屬性見表13.6。類名字顯示文本類名字顯示文本QLabelstatus_label狀態(tài):QLineEditeditDatabase QLabeltextLabel2驅(qū)動:QLineEditeditUsername QLabeltextLabel3數(shù)據(jù)庫名:QLineEditeditPassword QLabeltextLab
42、el4用戶名:QLineEditeditHostname QLabeltextLabel4_2密碼:QSpinBoxportSpinBox QLabeltextLabel5主機(jī)名:QPushButtonokButton連接QLabeltextLabel5_2端口:QPushButtoncancelButton退出QComboBoxcomboDriver QGroupBoxconnGroupBox數(shù)據(jù)庫連接設(shè)置13.3.2 Qt操作主/從視圖及XML(2)在頭文件“connectdlg.h”中,ConnDlg類繼承自QDialog類,主要完成從界面獲取用戶設(shè)置的連接參數(shù)信息。ConnDlg類的定
43、義中聲明了需要的各種函數(shù),其具體代碼。(3)在源文件“connectdlg.cpp”中,ConnDlg類的構(gòu)造函數(shù)完成了初始化ui界面及查找當(dāng)前所有可用的Qt數(shù)據(jù)庫驅(qū)動,并將其加入ui界面的驅(qū)動組合框中,以及其他一些功能,其具體代碼如下:#include connectdlg.h#include ui_connectdlg.h#include #include ConnDlg:ConnDlg(QWidget *parent) : QDialog(parent) ui.setupUi(this); QStringList drivers = QSqlDatabase:drivers();/(a)
44、 boDriver-addItems(drivers);/(b) connect(boDriver,SIGNAL(currentIndexChanged( const QString & ),this,SLOT(driverChanged(const QString &);/(c)ui.status_label-setText(tr(準(zhǔn)備連接數(shù)據(jù)庫!);/(d)13.3.2 Qt操作主/從視圖及XML槽函數(shù)driverChanged()的具體代碼如下:void ConnDlg:driverChanged(const QString & text)if(text =QSQ
45、LITE)/(a)ui.editDatabase-setEnabled(false);ui.editUsername-setEnabled(false);ui.editPassword-setEnabled(false);ui.editHostname-setEnabled(false);ui.portSpinBox-setEnabled(false);elseui.editDatabase-setEnabled(true);ui.editUsername-setEnabled(true);ui.editPassword-setEnabled(true);ui.editHostname-set
46、Enabled(true);ui.portSpinBox-setEnabled(true);13.3.2 Qt操作主/從視圖及XMLdriverName()函數(shù)的具體代碼如下:QString ConnDlg:driverName() const return boDriver-currentText();databaseName()函數(shù)的具體代碼如下:QString ConnDlg:databaseName() const return ui.editDatabase-text();userName()函數(shù)的具體代碼如下:QString ConnDlg:userName() const ret
47、urn ui.editUsername-text();13.3.2 Qt操作主/從視圖及XMLpassword()函數(shù)的具體代碼如下:QString ConnDlg:password() constreturn ui.editPassword-text();hostName()函數(shù)的具體代碼如下:QString ConnDlg:hostName() constreturn ui.editHostname-text();port()函數(shù)的具體代碼如下:int ConnDlg:port() constreturn ui.portSpinBox-value();on_okButton_clicked
48、()函數(shù),當(dāng)用戶單擊“連接”按鈕時,此函數(shù)被調(diào)用,其具體實現(xiàn)代碼。13.3.2 Qt操作主/從視圖及XML函數(shù)addConnection()用來建立一條數(shù)據(jù)庫連接,其具體實現(xiàn)內(nèi)容如下:QSqlError ConnDlg:addConnection(const QString &driver, const QString &dbName, const QString &host,const QString &user, const QString &passwd, int port)QSqlError err; QSqlDatabase db = QSql
49、Database:addDatabase(driver); db.setDatabaseName(dbName); db.setHostName(host); db.setPort(port); if (!db.open(user, passwd)/(a)err = db.lastError(); return err;/返回這個錯誤信息13.3.2 Qt操作主/從視圖及XMLaddSqliteConnection()函數(shù)建立一條QSQLITE數(shù)據(jù)庫驅(qū)動對應(yīng)的sqlite數(shù)據(jù)庫連接,其具體內(nèi)容如下:void ConnDlg:addSqliteConnection()QSqlDatabase d
50、b = QSqlDatabase:addDatabase(QSQLITE);db.setDatabaseName(databasefile);if (!db.open()ui.status_label-setText(db.lastError().text();return;ui.status_label-setText(tr(創(chuàng)建sqlite數(shù)據(jù)庫成功!);ConnDlg:creatDB()函數(shù)創(chuàng)建了相關(guān)的兩張數(shù)據(jù)表,并在其中插入適當(dāng)信息。其具體代碼。13.3.2 Qt操作主/從視圖及XML(4)修改“main.cpp”的代碼如下:#include mainwindow.h#include
51、#include #include connectdlg.hint main(int argc, char *argv) QApplication a(argc, argv); ConnDlg dialog; if (dialog.exec() != QDialog:Accepted) return -1; dialog.show(); return a.exec();13.3.2 Qt操作主/從視圖及XML(5)在“SQLE”文件中添加如下內(nèi)容:QT += sql(6)運行程序,出現(xiàn)如圖13.7所示的界面。13.3.2 Qt操作主/從視圖及XML3主主/從視圖應(yīng)用從視圖應(yīng)用(1)在
52、頭文件“mainwindow.h”中添加代碼。(2)在源文件“mainwindow.cpp”中添加代碼。changeFactory()函數(shù)的具體代碼如下:void MainWindow:changeFactory(QModelIndex index) QSqlRecord record = factoryModel-record(index.row(); /(a) QString factoryId = record.value(id).toString();/(b) carModel-setFilter(id = + factoryId +) ;/(c) showFactorytProfil
53、e(index);/(d)13.3.2 Qt操作主/從視圖及XML在“詳細(xì)信息”中顯示所選汽車制造商的信息函數(shù)showFactorytProfile()的具體代碼如下:void MainWindow:showFactorytProfile(QModelIndex index) QSqlRecord record = factoryModel-record(index.row();/(a) QString name = record.value(manufactory).toString();/(b) int count = carModel-rowCount();/(c) profileLab
54、el-setText(tr(汽車制造商:%1n產(chǎn)品數(shù)量: %2).arg(name). arg(count);/(d) profileLabel-show(); titleLabel-hide(); attribList-hide();showCarDetails()函數(shù)的具體代碼。13.3.2 Qt操作主/從視圖及XML函數(shù)getAttribList()檢索以上獲得的car標(biāo)簽下的所有子節(jié)點,將這些子節(jié)點的信息在“詳細(xì)信息”的QListWidget窗體中顯示。這些信息包括信息編號number和該編號下的信息內(nèi)容,其具體代碼如下:void MainWindow:getAttribList(QD
55、omNode car) attribList-clear(); QDomNodeList attribs = car.childNodes(); QDomNode node; QString attribNumber; for (int j = 0; j setText(tr(%1).arg(showText); 因為addCar()函數(shù)此時還沒有實現(xiàn)具體的功能,所以代碼部分暫時為空:void MainWindow:addCar()13.3.2 Qt操作主/從視圖及XMLdelCar()函數(shù)的具體代碼。removeCarFromFile()函數(shù)遍歷XML文件中的所有car標(biāo)簽,首先找出id屬性
56、與汽車表中所選記錄主鍵相同的節(jié)點,然后將其刪除。其具體代碼如下:void MainWindow:removeCarFromFile(int id) QDomNodeList cars = carData.elementsByTagName(car); for (int i = 0; iremoveRow(index.row();刪除了某個汽車制造商的全部產(chǎn)品后,需要刪除這個汽車制造商,decreaseCarCount()函數(shù)實現(xiàn)了此功能,其具體代碼如下:void MainWindow:decreaseCarCount(QModelIndex index) int row = index.row
57、(); int count = carModel-rowCount();/(a) if (count = 0)/(b) factoryModel-removeRow(row);13.3.2 Qt操作主/從視圖及XMLreadCarData()函數(shù)的具體代碼如下:void MainWindow:readCarData() if (!file-open(QIODevice:ReadOnly) return; if (!carData.setContent(file) file-close(); return; file-close();在QGroupBox* MainWindow:createFa
58、ctoryGroupBox()函數(shù)的“factoryView- setAlternatingRowColors(true)和和QGroupBox *box = new QGroupBox (tr(汽汽車制造商車制造商)”語句之間添加以下代碼:factoryView-setModel(factoryModel);connect(factoryView, SIGNAL(clicked (QModelIndex ), this, SLOT(changeFactory(QModelIndex );13.3.2 Qt操作主/從視圖及XML在QGroupBox* MainWindow:createCarG
59、roupBox() 函數(shù)的“carView- set AlternatingRowColors(true)和QVBoxLayout *layout = new QVBoxLayout”語句之間添加以下代碼:carView-setModel(carModel);connect(carView, SIGNAL(clicked(QModelIndex), this, SLOT(showCarDetails(QModelIndex);connect(carView, SIGNAL(activated(QModelIndex), this, SLOT(showCarDetails(QModelIndex
60、);當(dāng)用戶選擇了汽車表中的某一行時,槽函數(shù)showCarDetails()被調(diào)用。在void MainWindow:createMenuBar()函數(shù)的最后添加如下代碼:connect(addAction, SIGNAL(triggered(bool), this, SLOT(addCar();connect(deleteAction, SIGNAL(triggered(bool), this, SLOT(delCar();connect(quitAction, SIGNAL(triggered(bool), this, SLOT(close();13.3.2 Qt操作主/從視圖及XMLindexOfFactory()函數(shù)通過制造商的名稱進(jìn)行檢索,并返回一個匹配的模型索引
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國中置電機(jī)自行車行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國PTZ電子體積校正器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國軍用飛行器模擬器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國工業(yè)木鋸機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 期末測試卷01【考試范圍:6-10單元】(原卷版)
- 2025國際商業(yè)代理合同詳細(xì)版樣本
- 擔(dān)保合同范文集錦年
- 健身房私教合同范文
- 電力設(shè)備采購合同模板
- 2025XL數(shù)字地震儀器租賃合同
- 《瘋狂動物城》全本臺詞中英文對照
- 中專數(shù)學(xué)(基礎(chǔ)模塊)上冊課件
- 高考作文復(fù)習(xí)任務(wù)驅(qū)動型作文的審題立意課件73張
- 品質(zhì)部經(jīng)理KRA KPI考核表
- 國家中小學(xué)智慧教育平臺推動家校共育
- 《馬克思主義與社會科學(xué)方法論》授課教案
- 一個28歲的漂亮小媳婦在某公司打工-被老板看上之后
- 馬工程教育哲學(xué)課件第十章 教育哲學(xué)與教師發(fā)展
- GB/T 11376-2020金屬及其他無機(jī)覆蓋層金屬的磷化膜
- 成功源于自律 主題班會課件(共34張ppt)
- 新青島版(五年制)五年級下冊小學(xué)數(shù)學(xué)全冊導(dǎo)學(xué)案(學(xué)前預(yù)習(xí)單)
評論
0/150
提交評論