Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第7、8章 文件與數(shù)據(jù)庫、模型視圖結(jié)構(gòu)_第1頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第7、8章 文件與數(shù)據(jù)庫、模型視圖結(jié)構(gòu)_第2頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第7、8章 文件與數(shù)據(jù)庫、模型視圖結(jié)構(gòu)_第3頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第7、8章 文件與數(shù)據(jù)庫、模型視圖結(jié)構(gòu)_第4頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第7、8章 文件與數(shù)據(jù)庫、模型視圖結(jié)構(gòu)_第5頁
已閱讀5頁,還剩173頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識(shí)Qt框架第2章Qt開發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對(duì)話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第7章文件與數(shù)據(jù)庫7.1Qt文件系統(tǒng)7.2目錄操作7.3文件操作7.4QtSQL概述7.5數(shù)據(jù)庫操作7.1Qt文件系統(tǒng)Qt的文件系統(tǒng)主要用于處理外部設(shè)備、進(jìn)程、文件等的輸入與輸出,以及對(duì)文件和目錄操作。Qt文件系統(tǒng)的功能通過Qt的一些支持?jǐn)?shù)據(jù)塊讀/寫的輸入/輸出(I/O)類來實(shí)現(xiàn)。7.1.1文件系統(tǒng)類Qt的文件系統(tǒng)包含多個(gè)支持讀/寫數(shù)據(jù)塊的設(shè)備。這里所說的“設(shè)備”,不是指平常所說的硬件設(shè)備,而是指軟件設(shè)備,也就是像QFile、Qprocess等這樣的文件I/O設(shè)備對(duì)象。下面是部分文件系統(tǒng)類及功能。在上述類中,其繼承關(guān)系可以大致分為3種類型:一種是完全獨(dú)立的類,比如QDir、QFileInfo、QImageReader和Qurl等,它們既無父類也無子類;第二種是只有一個(gè)父類而沒有子類的類,比如QFileSystemWatcher、QSettings、QSocketNotifier、QTextDocument只有QObject一個(gè)父類,QDataStream、QTextStream只有QIODeviceBase一個(gè)父類;第三種是繼承關(guān)系相對(duì)比較復(fù)雜的類,像QIODevice、QBuff、QFile等。7.1.2文件I/O設(shè)備Qt文件系統(tǒng)中的相關(guān)操作類,也稱為文件I/O設(shè)備,都是從QIODevice類派生而來的,QIODevice類為這些I/O設(shè)備提供了一個(gè)基礎(chǔ)的抽象接口。QIODevice類繼承于QObject和QIODeviceBase類,如圖7.1所示。該類是一個(gè)抽象類,不能直接實(shí)例化,一般是使用它所定義的接口,例如open()、read()和write()等,來實(shí)現(xiàn)與設(shè)備無關(guān)的相關(guān)I/O功能。在訪問一個(gè)設(shè)備之前,需要首先打開該設(shè)備,并且必須指定正確的打開模式。QIODevice中的所有打開模式在其基類QIODeviceBase中定義,如表7.2所示。7.2目錄操作在Qt中,使用QDir

和QTemporaryDir類的對(duì)象來進(jìn)行目錄操作。其中,QDir用于普通目錄的操作,QTemporaryDir

用于臨時(shí)目錄的操作。7.2.1QDir類QDir類位于Qt的Core模塊內(nèi),用于訪問目錄結(jié)構(gòu)及其內(nèi)容,可以操作路徑名、訪問路徑和文件的相關(guān)信息以及操作低層的文件系統(tǒng),還可以訪問Qt的資源系統(tǒng)。下面是一段示例代碼:上述代碼的運(yùn)行結(jié)果如下圖所示。7.2.2QTemporaryDir類QTemporaryDir類用于創(chuàng)建、刪除臨時(shí)目錄。使用QTemporaryDir類可以在系統(tǒng)臨時(shí)目錄,即QDir::tempPath目錄下創(chuàng)建一個(gè)臨時(shí)目錄,臨時(shí)目錄名稱以QCoreApplication::applicationName()函數(shù)的返回值為前綴,后加6個(gè)字符。臨時(shí)目錄可以設(shè)置為使用完后自動(dòng)刪除,即臨時(shí)目錄變量刪除時(shí),臨時(shí)目錄也刪除。下面是一段簡(jiǎn)單的示例代碼。該示例代碼的運(yùn)行結(jié)果如下圖所示。圖中上部分為資源管理器中的系統(tǒng)臨時(shí)目錄。7.2.3QFileInfo類在圖7.2所示的示例程序中,使用了QFileInfo類來獲取某個(gè)文件的信息。下面是使用QFileInfo成員函數(shù)的一段示例代碼。上述示例代碼的輸出結(jié)果如下:7.2.4常用操作目錄操作主要包括:新建、刪除、重命名、查詢和遍歷等。1、新建使用QDir類的成員函數(shù)mkdir()或mkpath()來創(chuàng)建單層或多層目錄。函數(shù)原型如下:

boolQDir::mkdir(constQString&dirName)const或

boolQDir::mkpath(constQString&dirPath)const例如,下面的語句QDirdir;dir.mkdir(“f:/qt”);將會(huì)在F盤的根目錄下創(chuàng)建一個(gè)名為qt的新的子目錄。而下面的語句QDirdir;dir.mkpath(“f:/qt1/qt2/demo”)則會(huì)在F盤的根目錄下創(chuàng)建名為demo的子目錄。若demo子目錄的上一級(jí)目錄不存在,則會(huì)依次創(chuàng)建其上一級(jí)目錄。2、刪除使用QDir類的成員函數(shù)rmdir()、rmpath()或removeRecursively()來刪除目錄。其中,rmdir()用于刪除單層空目錄;rmpath()用于刪除多層空目錄;removeRecursively()刪除目錄及其中的所有文件。例如,下面的語句:QDirdir;dir.rmdir(“f:/qt”);將會(huì)刪除F盤根目錄下的名為qt的空子目錄。而下面的語句:QDirdir;dir.rmpath(“f:/qt1/qt2/demo”)則會(huì)刪除F盤根目錄下的名為demo的空子目錄及其上一級(jí)目錄中的空目錄。而下面的語句:QDirdir(“f:/qt1/qt2/demo”);dir.removeRecursively()則會(huì)刪除F盤根目錄下的名為demo的目錄及其中的所有內(nèi)容(子目錄和文件)。3、重命名使用QDir類的成員函數(shù)rename()來重命名目錄。boolQDir::rename(constQString&oldName,constQString&newName)其中,參數(shù)oldName和newName分別表示目錄的原名稱和新名稱。例如,下面的語句QDirdir;dir.rename(“f:/qt”,”f:/qt2”);將F盤根目錄下的qt目錄名稱修改為qt2。4、屬性查詢目錄的屬性可以通過QDir類和QFileInfo類的成員函數(shù)進(jìn)行查詢。使用QDir類的成員函數(shù)isAbsolute()、isRelative()、isAbsolutePath()、isRelativePath()、isReadable()、isRoot()和isEmpty()來判斷目錄是絕對(duì)路徑還是相對(duì)路徑、是否可讀、是否是根目錄和是否為空,目錄的大小、創(chuàng)建時(shí)間、修改時(shí)間等屬性則需要通過QFileInfo類的成員函數(shù)來進(jìn)行查詢。5、遍歷通過遍歷目錄可以獲取該目錄下的所有子目錄和文件信息,使用QDir類的entryList()或entryInfoList()成員函數(shù)可以完成相應(yīng)的操作?!纠?.1】編寫一個(gè)名為examp7_1的Qt應(yīng)用程序,實(shí)現(xiàn)指定目錄的遍歷功能。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_1的應(yīng)用程序。該應(yīng)用程序主窗口基于QWidget類。(2)在應(yīng)用程序主窗口中添加兩個(gè)控件,一個(gè)是QLineEdit對(duì)象lineEdit,另一個(gè)是QListWidget對(duì)象listWidget。lineEdit用于輸入目錄名稱,listWidget用于顯示目錄下的信息。(3)為應(yīng)用程序的Widget類添加成員函數(shù)showInfoList(),以及槽函數(shù)showDirs()和showSubDirs()。函數(shù)showInfoList()用于遍歷指定的目錄;槽函數(shù)showDirs()用于響應(yīng)lineEdit對(duì)象的輸入結(jié)束信號(hào);槽函數(shù)showSubDirs()用于響應(yīng)listWidget子項(xiàng)的雙擊信號(hào)。函數(shù)聲明及實(shí)現(xiàn)代碼如下:(4)在Widget類的構(gòu)造函數(shù)中添加初始化代碼。(5)構(gòu)建并運(yùn)行程序。7.3文件操作應(yīng)用程序?qū)ξ募牟僮?,主要包括文件的打開與關(guān)閉、信息的查詢、內(nèi)容的讀寫,以及重命名、移動(dòng)與復(fù)制、刪除等。這些功能通過Qt的文件I/O設(shè)備QFile、QSaveFile等來實(shí)現(xiàn)。7.3.1相關(guān)操作類實(shí)現(xiàn)Qt應(yīng)用程序的文件操作功能,除了需要使用上面介紹的QDir、QFileInfo

等類之外,還可以使用QFile、QTextStream

和QDataStream

等類。1、QFile類QFile類提供了一個(gè)用于讀/寫文件的接口,可以用來讀/寫文本文件、二進(jìn)制文件和Qt的資源文件。下面是一段使用QFile對(duì)象的示例代碼,該示例代碼打開用戶選擇的文本文件,并在文本編輯器顯示。Qt的QTextStream

是以流方式操作文本文件的類。與QFile類相比,它提供了更為方便的接口來讀寫文本,可以操作QIODevice、QByteArray和QString。使用QTextStream的流操作符,可以方便地讀/寫單詞、行和數(shù)字。對(duì)于生成的文本,QTextStream

還提供了字段填充、對(duì)齊和數(shù)字格式化的選項(xiàng)。QTextStream類的使用非常簡(jiǎn)單,下面是一段示例代碼,該示例代碼打開用戶選擇的文本文件,并在文本編輯器顯示。3、QDataStream類QDataStream類實(shí)現(xiàn)了將QIODevice的二進(jìn)制數(shù)據(jù)串行化。一個(gè)數(shù)據(jù)流就是一個(gè)二進(jìn)制編碼信息流,完全獨(dú)立于主機(jī)的操作系統(tǒng)、CPU和字節(jié)順序。數(shù)據(jù)流也可以讀/寫未編碼的二進(jìn)制數(shù)據(jù)。QDataStream類可以實(shí)現(xiàn)C++基本數(shù)據(jù)類型的串行化,比如char、short、int和char*等。下面是一段示例代碼:7.3.2文件信息查詢QFileInfo類提供了對(duì)文件進(jìn)行操作時(shí)獲得的文件相關(guān)屬性信息,包括文件名、文件大小、創(chuàng)建時(shí)間、最后修改時(shí)間、最后訪問時(shí)間,以及文件是否為目錄、文件或符號(hào)鏈接和讀寫屬性等。【例7.2】編寫一個(gè)Qt應(yīng)用程序,獲取用戶所選文件信息。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_2的應(yīng)用程序。該應(yīng)用程序主窗口基于QWidget類。(2)雙擊widget.ui界面文件,打開QtDesigner設(shè)計(jì)工具,設(shè)計(jì)如圖7.6所示的應(yīng)用程序主窗口界面。界面中組件對(duì)象名稱及類型請(qǐng)參見教材源碼。(3)為主窗口中的“文件”和“獲取文件信息”兩個(gè)按鈕添加clicked信號(hào)槽函數(shù),并編寫代碼。如下所示。7.3.3文本文件讀寫文本文件是指以純文本格式存儲(chǔ)的文件,例如Windows的記事本文件。Qt提供了2種讀寫文本文件的方法,一種是使用QFile類的IODevice讀寫功能直接進(jìn)行文件的讀寫,另一種是利用Qfile和QTextStream結(jié)合起來,用流(Stream)的方法進(jìn)行文件讀寫。【例7.3】編寫一個(gè)Qt應(yīng)用程序,示例文本文件的讀/寫操作。(1)打開QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_3的應(yīng)用程序。該應(yīng)用程序主窗口基于QMainWindow類。(2)雙擊mainwindow.ui界面文件,打開QtDesigner設(shè)計(jì)工具,設(shè)計(jì)應(yīng)用程序主窗口界面及工具欄上的Action。如下圖7.8所示。(3)為類MainWindow添加4個(gè)私有成員函數(shù),來實(shí)現(xiàn)文本文件的打開和保存功能。聲明代碼如下:(4)編寫4個(gè)私有成員代碼,完成相應(yīng)的文本文件讀/寫功能。如下所示。(5)為Action添加槽函數(shù)。如下所示。7.3.4二進(jìn)制文件讀寫QDataStream類提供了基于QIODevice

的二進(jìn)制數(shù)據(jù)的序列化。QDataStream既能夠存取C++基本類型,如int、char、short等,也可以存取復(fù)雜的數(shù)據(jù)類型,例如自定義的類?!纠?.4】編寫一個(gè)Qt應(yīng)用程序,示例二進(jìn)制文件的讀/寫操作。(1)打開QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_4的應(yīng)用程序。主窗口基于QMainWindow類。(2)雙擊mainwindow.ui界面文件,打開QtDesigner設(shè)計(jì)工具,設(shè)計(jì)應(yīng)用程序主窗口界面及工具欄上的Action。(3)編寫上述Action的triggered信號(hào)槽函數(shù)代碼,如下所示。(4)構(gòu)建并運(yùn)行程序。7.4QtSQL概述Qt的SQL模塊提供對(duì)數(shù)據(jù)庫編程的支持。Qt支持多種常見的數(shù)據(jù)庫,如MySQL、Oracle、MSSQLServer、SQLite等。7.4.1QtSQL模塊QtSQL模塊包含包括多個(gè)類,可以實(shí)現(xiàn)數(shù)據(jù)庫連接、SQL語句執(zhí)行、數(shù)據(jù)獲取與界面顯示等功能。QtSQL模塊中的類可以分為三個(gè)層次,即驅(qū)動(dòng)層、SQL接口層和用戶接口層。驅(qū)動(dòng)層為具體的數(shù)據(jù)庫和SQL接口層之間提供底層橋梁;SQL接口層提供了對(duì)數(shù)據(jù)庫的訪問支持;用戶接口層提供數(shù)據(jù)從數(shù)據(jù)庫到界面窗口部件的映射,使用Qt的模型/視圖結(jié)構(gòu)實(shí)現(xiàn)。QtSQL模塊類所屬層次及功能如下表所示:7.4.2QtSQL驅(qū)動(dòng)QtSQL模塊使用數(shù)據(jù)庫驅(qū)動(dòng)來與不同的數(shù)據(jù)庫接口進(jìn)行通信。Qt的SQL模型接口是獨(dú)立于數(shù)據(jù)庫的,所以所有數(shù)據(jù)庫特定的代碼都包含在了這些驅(qū)動(dòng)中。Qt默認(rèn)支持一些驅(qū)動(dòng),如表7.11所示。7.5數(shù)據(jù)庫操作Qt應(yīng)用程序中的數(shù)據(jù)庫的操作,主要包括連接數(shù)據(jù)庫、打開數(shù)據(jù)庫、查詢數(shù)據(jù)庫、創(chuàng)建數(shù)據(jù)表、對(duì)數(shù)據(jù)表中的記錄執(zhí)行增/刪/改/查操作等。7.5.1數(shù)據(jù)庫的連接應(yīng)用程序要與數(shù)據(jù)庫進(jìn)行交互,必須先創(chuàng)建并打開一個(gè)或多個(gè)數(shù)據(jù)庫連接。在Qt中,數(shù)據(jù)庫的連接、打開等操作通過QSqlDatabase類來實(shí)現(xiàn)。一般使用QSqlDatabase類的靜態(tài)成員函數(shù)addDatabase()來創(chuàng)建數(shù)據(jù)庫連接。該函數(shù)的原型如下:1、連接MySQL數(shù)據(jù)庫Qt與MySQL數(shù)據(jù)庫的連接,除了使用QMYSQL驅(qū)動(dòng)之外,還需要使用QSqlDatabase的一些成員函數(shù)來設(shè)置數(shù)據(jù)庫服務(wù)器主機(jī)名稱、端口號(hào)、用戶名、密碼等連接參數(shù)?!纠?.5】編寫一個(gè)Qt的非GUI應(yīng)用程序,實(shí)現(xiàn)與MySQL數(shù)據(jù)庫的連接。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_5的非GUI的Qt應(yīng)用程序。(2)打開項(xiàng)目文件examp7_5.pro,在其中添加代碼“QT+=sql”,引入QtSQL模塊。(3)打開項(xiàng)目main.cpp文件,在其中添加如下代碼:(4)構(gòu)建并運(yùn)行程序。輸出結(jié)果如圖7.14所示。從程序的輸出結(jié)果可以看出,數(shù)據(jù)庫沒有被成功打開,主要原因是程序不能與名為localhost的MySQL數(shù)據(jù)庫服務(wù)器連接。(5)啟動(dòng)本機(jī)的MySQL數(shù)據(jù)庫服務(wù)器,并查看該服務(wù)器上的數(shù)據(jù)庫。如圖7.15所示。(6)再次運(yùn)行程序,輸出結(jié)果如圖7.16所示。2、連接SQLite數(shù)據(jù)庫Qt默認(rèn)提供SQLite數(shù)據(jù)庫驅(qū)動(dòng)。SQLite是一種無需服務(wù)器、無需進(jìn)行任何配置的數(shù)據(jù)庫,它的所有數(shù)據(jù)表、索引等數(shù)據(jù)庫元素全都存儲(chǔ)在一個(gè)文件里,所以又被稱為文件數(shù)據(jù)庫。另外,SQLite還是一款可以跨平臺(tái)使用的數(shù)據(jù)庫,其數(shù)據(jù)庫文件可以在不同平臺(tái)之間隨意復(fù)制。連接SQLite數(shù)據(jù)庫非常簡(jiǎn)單,只需要使用Qt的QSQLITE驅(qū)動(dòng)即可。需要注意的是,由于SQLite數(shù)據(jù)庫是一種進(jìn)程內(nèi)的本地?cái)?shù)據(jù)庫,所以連接時(shí)不需要設(shè)置數(shù)據(jù)庫名、用戶名、密碼、主機(jī)名和端口等連接參數(shù)。【例7.6】編寫一個(gè)Qt的非GUI應(yīng)用程序,實(shí)現(xiàn)與SQLite數(shù)據(jù)庫的連接。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_6的非GUI的Qt應(yīng)用程序。(2)打開項(xiàng)目文件examp7_6.pro,在其中添加代碼“QT+=sql”,引入QtSQL模塊。(3)打開項(xiàng)目main.cpp文件,在其中添加如下代碼:若在設(shè)置數(shù)據(jù)庫名稱時(shí)使用“:memory:”標(biāo)識(shí)符,則說明這是建立在內(nèi)存中的數(shù)據(jù)庫,也就是說該數(shù)據(jù)庫只在程序運(yùn)行期間有效,等程序運(yùn)行結(jié)束時(shí)就會(huì)將其銷毀。如上述代碼中的語句1所示。若在設(shè)置數(shù)據(jù)庫名稱時(shí)使用具體的數(shù)據(jù)庫名稱,則會(huì)在指定的位置創(chuàng)建數(shù)據(jù)庫文件。如上述代碼中的語句2所示。(4)構(gòu)建并運(yùn)行程序。輸出結(jié)果如圖7.17所示。3、連接MSAccess數(shù)據(jù)庫Qt默認(rèn)提供QODBC數(shù)據(jù)庫驅(qū)動(dòng),如圖7.13所示。可以使用該驅(qū)動(dòng)來連接MSAccess數(shù)據(jù)庫。【例7.7】編寫一個(gè)Qt的非GUI應(yīng)用程序,實(shí)現(xiàn)與MSAccess數(shù)據(jù)庫的連接。(1)準(zhǔn)備測(cè)試用的Access數(shù)據(jù)庫。這里使用教材源碼中的數(shù)據(jù)庫文件chap07\examp7_7\studentDB.mdb。(2)注冊(cè)數(shù)據(jù)源。首先打開如圖7.18所示的Windows系統(tǒng)ODBC數(shù)據(jù)源管理工具,單擊“添加”按鈕,選擇“MicrosoftAccessdriver(*.mdb,*.accdb)”數(shù)據(jù)源驅(qū)動(dòng)程序,如圖7.19所示。(3)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp7_7的非GUI的Qt應(yīng)用程序。(4)打開項(xiàng)目文件examp7_7.pro,在其中添加代碼“QT+=sql”,引入QtSQL模塊。(5)打開項(xiàng)目main.cpp文件,在其中添加如下代碼:(6)構(gòu)建并運(yùn)行程序。輸出結(jié)果如圖7.21所示。7.5.2數(shù)據(jù)庫的操作使用Qt數(shù)據(jù)庫驅(qū)動(dòng)成功連接到相應(yīng)的數(shù)據(jù)庫后,就可以進(jìn)行數(shù)據(jù)庫的創(chuàng)建、數(shù)據(jù)表的創(chuàng)建、記錄的添加等操作了。在Qt中,對(duì)數(shù)據(jù)庫的操作通過QSqlQuery類實(shí)現(xiàn),該類的部分成員函數(shù)及功能如表7.13所示。1、創(chuàng)建數(shù)據(jù)庫調(diào)用QSqlQuery::exec()函數(shù)執(zhí)行SQL命令“createdatabasedatabase_name”,即可創(chuàng)建一個(gè)MySQL數(shù)據(jù)庫。【例7.8】修改例7.5中程序代碼,使程序運(yùn)行后新建一個(gè)名為qt_examp7_8db的MySQL數(shù)據(jù)庫。(1)復(fù)制例7.5中的examp7_5項(xiàng)目,將其名稱修改為examp7_8。(2)打開項(xiàng)目examp7_8的main.cpp文件,將其中的部分代碼修改如下:(3)啟動(dòng)MySQL數(shù)據(jù)庫服務(wù)器。(4)構(gòu)建并運(yùn)行程序。程序運(yùn)行完成后,打開phpMyAdmin工具查看名為qt_examp7_8db的MySQL數(shù)據(jù)庫是否創(chuàng)建成功。2、創(chuàng)建數(shù)據(jù)表調(diào)用QSqlQuery::exec()函數(shù)執(zhí)行SQL命令

createtabletable_name…即可在打開的MySQL數(shù)據(jù)庫中創(chuàng)建一張數(shù)據(jù)表?!纠?.9】編寫一個(gè)非GUI的Qt應(yīng)用程序,程序運(yùn)行后,在例7.8創(chuàng)建的名為qt_examp7_8db的數(shù)據(jù)庫中新建一張名為student的數(shù)據(jù)表,表結(jié)構(gòu)如圖7.23所示。(1)復(fù)制例7.8中的examp7_8項(xiàng)目,將其名稱修改為examp7_9。(2)打開項(xiàng)目examp7_9的main.cpp文件,將其中的部分代碼修改如下:(3)啟動(dòng)MySQL數(shù)據(jù)庫服務(wù)器。(4)構(gòu)建并運(yùn)行程序。程序運(yùn)行完成后,打開phpMyAdmin工具查看qt_examp7_8db數(shù)據(jù)庫中的student數(shù)據(jù)表是否創(chuàng)建成功。3、插入記錄插入記錄有2種方法,一種是使用QSqlQuery執(zhí)行SQL語句:insertintotable_name(fields_list)values(expression_list)直接插入數(shù)據(jù);另一種是執(zhí)行:insertintotable_name(fields_list)values(?,?,?,…)或insertintotable_name(fields_list)values(:fields_list)SQL語句,通過占位符綁定來插入數(shù)據(jù)。Qt支持兩種占位符綁定,即位置綁定和名稱綁定?!纠?.10】編寫一個(gè)非GUI的Qt應(yīng)用程序,示例數(shù)據(jù)表中數(shù)據(jù)的插入操作。(1)復(fù)制例7.9中的examp7_9項(xiàng)目,將其名稱修改為examp7_10。(2)打開項(xiàng)目examp7_10的main.cpp文件,將其中的部分代碼修改如下:(3)啟動(dòng)MySQL數(shù)據(jù)庫服務(wù)器。(4)構(gòu)建并運(yùn)行程序。程序運(yùn)行完成后,打開phpMyAdmin工具查看qt_examp7_8db數(shù)據(jù)庫中的student數(shù)據(jù)表中的數(shù)據(jù)是否插入成功。4、修改記錄要修改數(shù)據(jù)表中的記錄,只需要使用QSqlQuery執(zhí)行下面的SQL語句即可。updatetable_namesetfield_1=expression_1[,field_2=expression_2…][fromtable1_name[,table2_name]][where…]這里也可以使用占位符綁定?!纠?.11】編寫一個(gè)非GUI的Qt應(yīng)用程序,示例數(shù)據(jù)表中數(shù)據(jù)的更改操作。(1)復(fù)制例7.10中的examp7_10項(xiàng)目,將其名稱修改為examp7_11。(2)打開項(xiàng)目examp7_11的main.cpp文件,將其中的部分代碼修改如下:(3)啟動(dòng)MySQL數(shù)據(jù)庫服務(wù)器。(4)構(gòu)建并運(yùn)行程序。程序運(yùn)行結(jié)束后,可以看到student數(shù)據(jù)表中序號(hào)為1的學(xué)生姓名被修改為“王五”5、刪除記錄刪除記錄使用QSqlQuery執(zhí)行“DELETE”SQL語句來實(shí)現(xiàn)。DELETE語句的語法格式為:deletefromtable_name[where…]例如,用下面的語句刪除student表中姓名為“王一”的記錄:deletefromstudentwherename=“王一”6、查詢記錄查詢記錄使用QSqlQuery執(zhí)行“SELECT”SQL語句來實(shí)現(xiàn)。SELECT語句的完整語法格式較為復(fù)雜,其主要的子句如下:selectfields_listfromtable_name[where…][groupbygroup_by_expression][orderbyorder_expression[ASC|DESC]]其中,select和from子句是不可或缺的。【例7.12】編寫一個(gè)非GUI的Qt應(yīng)用程序,示例數(shù)據(jù)表中數(shù)據(jù)的查詢操作。(1)復(fù)制例7.11中的examp7_11項(xiàng)目,將其名稱修改為examp7_12。(2)打開項(xiàng)目examp7_12的main.cpp文件,將其中的部分代碼修改如下:(3)啟動(dòng)MySQL數(shù)據(jù)庫服務(wù)器。(4)構(gòu)建并運(yùn)行程序。課后作業(yè)思政本章結(jié)束Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識(shí)Qt框架第2章Qt開發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對(duì)話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第8章模型/視圖結(jié)構(gòu)8.1概述8.2數(shù)據(jù)模型8.3代理組件8.4視圖組件8.1概述模型/視圖結(jié)構(gòu)是Qt中用界面組件顯示與編輯數(shù)據(jù)的一種結(jié)構(gòu),它實(shí)現(xiàn)了數(shù)據(jù)和界面的分離,類似于M-V-C(Model-View-Controller)程序設(shè)計(jì)模式。8.1.1基本結(jié)構(gòu)Qt的模型/視圖結(jié)構(gòu)由三部分組成,即模型(Model)、視圖(View)和代理(Delegate)。如圖8.1所示。8.1.1基本結(jié)構(gòu)Data(數(shù)據(jù))就是指實(shí)際的數(shù)據(jù)源,如計(jì)算機(jī)系統(tǒng)的磁盤文件結(jié)構(gòu)、數(shù)據(jù)庫的數(shù)據(jù)表或計(jì)算機(jī)系統(tǒng)內(nèi)存中的字符串列表(QStringList)等;Model(模型)負(fù)責(zé)數(shù)據(jù)的提取與更新,并將數(shù)據(jù)提供給視圖顯示或編輯;View(視圖)是應(yīng)用程序的界面組件,它從模型獲得數(shù)據(jù)項(xiàng)的模型索引(ModelIndex),然后通過模型索引獲取到實(shí)際的數(shù)據(jù);Delegate(代理)的功能是讓用戶定制數(shù)據(jù)的界面顯示和編輯方式,當(dāng)視圖中的數(shù)據(jù)被編輯時(shí),代理通過模型索引與數(shù)據(jù)模型通信,并為數(shù)據(jù)的編輯提供一個(gè)合適的編輯器。8.1.2數(shù)據(jù)表示在Qt的模型/視圖結(jié)構(gòu)中,模型組件是核心,它為視圖組件和代理組件提供存取數(shù)據(jù)的標(biāo)準(zhǔn)接口。不管數(shù)據(jù)源中的數(shù)據(jù)結(jié)構(gòu)如何,Qt數(shù)據(jù)模型中的數(shù)據(jù)均以表格的層次結(jié)構(gòu)來組織,視圖組件通過這種邏輯結(jié)構(gòu)來存取模型中的數(shù)據(jù)。在Qt中,常見的數(shù)據(jù)模型表現(xiàn)形式有3種,即列表模型(ListModel)、表格模型(TableModel)和樹(TreeModel)模型。它們的數(shù)據(jù)表示方式如圖8.2所示。從圖中可以看出,雖然數(shù)據(jù)模型的表現(xiàn)形式不一樣,但數(shù)據(jù)模型中存儲(chǔ)數(shù)據(jù)的基本單元都是項(xiàng)(item),每個(gè)項(xiàng)有一個(gè)行號(hào)、一個(gè)列號(hào),還有一個(gè)父項(xiàng)(parentitem)。在列表和表格模式下,所有的項(xiàng)都有一個(gè)相同的頂層項(xiàng)(rootitem);在樹狀結(jié)構(gòu)中,盡管行號(hào)、列號(hào)、父項(xiàng)有點(diǎn)復(fù)雜,但是由這3個(gè)參數(shù)完全可以確定一個(gè)項(xiàng)的位置,從而存取項(xiàng)的數(shù)據(jù)。1、模型索引為了確保數(shù)據(jù)的表示與數(shù)據(jù)的獲取相分離,Qt引入了模型索引(modelindex)的概念。通過數(shù)據(jù)模型存取的每一個(gè)數(shù)據(jù)都使用一個(gè)模型索引來表示,視圖和代理都通過這個(gè)模型索引來獲取實(shí)際的數(shù)據(jù)。通常情況下,數(shù)據(jù)模型中的模型索引就是一個(gè)Qt的QModelIndex對(duì)象,它是對(duì)一塊數(shù)據(jù)的臨時(shí)引用,可以用來檢索或修改模型中的數(shù)據(jù)。注意,QModelIndex模型索引提供的存取數(shù)據(jù)的指針是臨時(shí)的,因?yàn)閿?shù)據(jù)模型隨時(shí)都可能對(duì)內(nèi)部數(shù)據(jù)的組織形式進(jìn)行更改。如果需要使用持久性的模型索引,則要使用QPersistentModelIndex對(duì)象。例如,下面的代碼:QModelIndexmodelIndex=model->index(row,column,parent);獲取model數(shù)據(jù)模型中行號(hào)為row、列號(hào)為column位置的數(shù)據(jù)項(xiàng)的模型索引。其中,參數(shù)parent表示該數(shù)據(jù)項(xiàng)的父項(xiàng)的模型索引,它也是一個(gè)QModelIndex對(duì)象。2、行號(hào)和列號(hào)在Qt數(shù)據(jù)模型中,數(shù)據(jù)一般都是以表格的形式來組織的,所以,可以通過行(row)號(hào)和列(column)號(hào)來對(duì)需要訪問的數(shù)據(jù)項(xiàng)進(jìn)行定位。需要注意的是,這并不意味著數(shù)據(jù)源中的數(shù)據(jù)是以二維數(shù)組的方式存儲(chǔ)的,使用行號(hào)和列號(hào)只是一種約定,以確保模型/視圖結(jié)構(gòu)中各組件間可以相互通信。注意,數(shù)據(jù)模型中數(shù)據(jù)項(xiàng)的行號(hào)和列號(hào)都是從0開始的。3、父項(xiàng)在Qt的數(shù)據(jù)模型中,列表模型或表格模型的所有數(shù)據(jù)項(xiàng)都以根項(xiàng)(Rootitem)為父項(xiàng)(parentitem),所以,它們都是頂層數(shù)據(jù)項(xiàng)(Toplevelitem)。頂層數(shù)據(jù)項(xiàng)的父項(xiàng)模型索引統(tǒng)一用QModelIndex()來表示。例如,對(duì)于圖8.3所示的表格模型中的3個(gè)數(shù)據(jù)項(xiàng)A、B和C,可以使用如下的代碼來獲取其模型索引。對(duì)于樹模型來說,情況要復(fù)雜一些,因?yàn)椴⒉皇撬械臄?shù)據(jù)項(xiàng)都處于頂層。樹模型中的每一個(gè)數(shù)據(jù)項(xiàng)都可能擁有自己的父項(xiàng),當(dāng)然它也可能是其他數(shù)據(jù)項(xiàng)的父項(xiàng)。所以,在獲取樹模型數(shù)據(jù)項(xiàng)的模型索引時(shí),必須明確指定其行號(hào)、列號(hào)和父項(xiàng)。例如,對(duì)于圖8.4所示的樹模型中的3個(gè)數(shù)據(jù)項(xiàng)A、B和C,可以使用如下的代碼來獲取其模型索引。4、項(xiàng)角色Qt數(shù)據(jù)模型中的數(shù)據(jù)項(xiàng)可以作為不同的角色(itemrole)在其他組件中使用,也可以為不同的情況提供不同類型的數(shù)據(jù)。例如,Qt::DisplayRole用于訪問可以作為文本顯示在視圖中的字符串。通常情況下,數(shù)據(jù)模型中的數(shù)據(jù)項(xiàng)都包含了一些不同角色的數(shù)據(jù),這些標(biāo)準(zhǔn)的角色由枚舉變量Qt::ItemDataRole來定義,常用的角色如表8.1所示。通過為每個(gè)角色提供適當(dāng)?shù)捻?xiàng)目數(shù)據(jù),模型可以為視圖和代理提供提示,告訴它們數(shù)據(jù)應(yīng)該怎樣展示給用戶。角色指出了從模型中引用哪種類型的數(shù)據(jù),視圖可以使用不同的方式來顯示不同的角色,如圖8.5所示。8.1.3相關(guān)Qt類模型/視圖結(jié)構(gòu)功能是通過眾多的Qt類共同實(shí)現(xiàn)的,這些類按功能分為3組,分別為模型類、視圖類和代理類。1、模型類模型類也被稱為數(shù)據(jù)模型類或數(shù)據(jù)模型組件。在Qt中,所有基于項(xiàng)數(shù)據(jù)(itemdata)的數(shù)據(jù)模型都是基于QAbstractItemModel類的,這個(gè)類定義了視圖和代理存取數(shù)據(jù)的接口。2、視圖類在Qt的模型/視圖結(jié)構(gòu)中,與視圖相關(guān)的幾個(gè)主要類及其描述,如表8.3所示。3、代理類在Qt的模型/視圖結(jié)構(gòu)中,與委托代理相關(guān)的幾個(gè)主要類及其描述如表8.4所示。8.2數(shù)據(jù)模型數(shù)據(jù)模型是Qt模型/視圖結(jié)構(gòu)的核心,它實(shí)現(xiàn)了數(shù)據(jù)與視圖的分離。下面介紹幾種常用的數(shù)據(jù)模型的使用方法。8.2.1QAbstractListModel模型QAbstractListModel是所有一維列表數(shù)據(jù)模型的抽象基類,它繼承自QAbstractItemModel類,又被QStringListModel、QVirtualKeyboardSelectionListModel和QWebEngineHistoryModel類直接繼承。QAbstractListModel類是抽象類,不能直接實(shí)例化,程序中使用其子類來創(chuàng)建數(shù)據(jù)模型。下面是QStringListModel數(shù)據(jù)模型類的繼承關(guān)系【例8.1】編寫一個(gè)Qt應(yīng)用程序演示QStringListModel數(shù)據(jù)模型的使用方法。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp8_1的Qt應(yīng)用程序。該應(yīng)用程序主窗口基于QMainWindow類。(2)雙擊項(xiàng)目界面文件mainwindow.ui,打開QtDesigner界面設(shè)計(jì)工具。在QtDesigner中設(shè)置應(yīng)用程序主窗口界面,設(shè)計(jì)工具欄上的功能按鈕及相應(yīng)的槽函數(shù),添加列表項(xiàng)單擊信號(hào)的槽函數(shù)。界面對(duì)象名稱及屬性請(qǐng)參見教材源碼。(3)在項(xiàng)目主窗口類MainWindow中添加QStringListModel數(shù)據(jù)模型指針model,以及初始化數(shù)據(jù)模型和列表視圖的私有成員函數(shù)initModel()和initView()。代碼如下:(4)打開mainwindow.cpp文件,添加成員函數(shù)initModel()和initView()的實(shí)現(xiàn)代碼。(5)在MainWindow類的構(gòu)造函數(shù)中調(diào)用initModel()和initView()函數(shù),完成數(shù)據(jù)模型和視圖的初始化工作。(6)在槽函數(shù)中添加代碼,實(shí)現(xiàn)工具按鈕的相應(yīng)功能。代碼如下:(7)實(shí)現(xiàn)狀態(tài)欄信息提示功能。當(dāng)用戶單擊列表項(xiàng)中的數(shù)據(jù)項(xiàng)時(shí),在應(yīng)用程序狀態(tài)欄中顯示該數(shù)據(jù)項(xiàng)的行號(hào)和列號(hào)信息。代碼如下:(8)構(gòu)建并運(yùn)行程序。8.2.2QFileSystemModel模型QFileSystemModel數(shù)據(jù)模型用于訪問本機(jī)文件系統(tǒng)數(shù)據(jù),將該數(shù)據(jù)模型與視圖組件QTreeView結(jié)合,可以實(shí)現(xiàn)本機(jī)文件系統(tǒng)資源的目錄樹顯示。QFileSystemModel類繼承于QAbstractItemModel,它沒有被其他類繼承。該類提供了豐富的成員函數(shù),可以使用這些成員函數(shù)來創(chuàng)建目錄、刪除目錄、重命名目錄,獲取文件名稱、目錄名稱、文件大小和詳細(xì)信息等?!纠?.2】使用QFileSystemModel數(shù)據(jù)模型,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件資源瀏覽器。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名稱為examp8_2的Qt應(yīng)用程序。選擇主窗口基類QWidget,不生成界面文件。(2)創(chuàng)建模型及視圖對(duì)象。打開項(xiàng)目文件widget.h,在其中添加如下代碼,為主窗口類Widget創(chuàng)建私有訪問權(quán)限的數(shù)據(jù)模型及視圖組件對(duì)象。(3)初始化數(shù)據(jù)模型及視圖對(duì)象。打開項(xiàng)目文件widget.cpp,在主窗口類Widget的構(gòu)造函數(shù)中添加代碼,對(duì)主窗口、數(shù)據(jù)模型及視圖進(jìn)行初始化。代碼如下:(4)構(gòu)建并運(yùn)行程序。8.2.3QStandardItemModel模型QStandardItemModel是以項(xiàng)數(shù)據(jù)為基礎(chǔ)的標(biāo)準(zhǔn)數(shù)據(jù)模型類,它繼承自QAbstractItemModel,沒有直接子類。其部分成員函數(shù)及功能如表8.7所示。【例8.3】編寫一個(gè)Qt應(yīng)用程序,演示QStandardItemModel數(shù)據(jù)模型的使用方法。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp8_3的Qt應(yīng)用程序。該應(yīng)用程序主窗口基于QWidget類。(2)打開Widget.h頭文件,在Widget類中添加數(shù)據(jù)模型對(duì)象指針model及成員函數(shù)createModel()和initView()。代碼如下:(3)打開Widget.cpp文件,編寫createModel()和initView()函數(shù)的實(shí)現(xiàn)代碼,并在Widget類的構(gòu)造函數(shù)中調(diào)用它們。代碼如下:(4)構(gòu)建并運(yùn)行程序。8.2.4QAbstractTableMode模型QAbstractTableMode是所有表格數(shù)據(jù)模型的抽象基類,它繼承自QAbstractItemModel其直接子類為QSqlQueryModel類,間接子類還有QSqlTableModel類和QSqlRelationalTableModel類。這些類之間的繼承關(guān)系如圖8.10所示。QAbstractTableMode類定義了一些表模型的公共接口,它不能被直接實(shí)例化,實(shí)際編程時(shí)需要使用它的3個(gè)子類對(duì)象。1、QSqlQueryModelQSqlQueryModel是一個(gè)基于SQL查詢的只讀數(shù)據(jù)模型。它封裝了執(zhí)行SELECT語句從數(shù)據(jù)庫查詢數(shù)據(jù)的功能,只能作為只讀數(shù)據(jù)源使用,不能對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行編輯?!纠?.4】編寫一個(gè)Qt應(yīng)用程序,演示QSqlQueryModel數(shù)據(jù)模型的使用方法。(1)創(chuàng)建一個(gè)名為qt_examp8_4db的MySQL數(shù)據(jù)庫,并在庫中添加一張名為students的數(shù)據(jù)表。Students數(shù)據(jù)表的字段及測(cè)試數(shù)據(jù)如圖8.12所示。(2)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp8_4的Qt應(yīng)用程序。該應(yīng)用程序主窗口基于QMainWindow類。(3)雙擊mainwindow.ui界面文件,打開QtDesigner設(shè)計(jì)工具。刪除默認(rèn)的菜單欄;在主窗口中心區(qū)域添加一個(gè)名tableView的QTableView視圖組件;創(chuàng)建一個(gè)名為“打開”的Action,并將其添加到工具欄上。(4)打開mainwindow.h文件,為類MainWindow添加2個(gè)私有成員變量db和model,分別表示數(shù)據(jù)庫和數(shù)據(jù)模型。如下所示。(5)打開mainwindow.cpp文件,在“打開”Action的槽函數(shù)中編寫代碼。如下所示。(6)構(gòu)建并運(yùn)行程序。2、QSqlTableModelQSqlTableModel

繼承自QSqlQueryModel類,它是一個(gè)直接根據(jù)數(shù)據(jù)表名稱來對(duì)數(shù)據(jù)表進(jìn)行讀/寫的數(shù)據(jù)模型。使用該模型不需要熟悉SQL命令語法,只需要調(diào)用相應(yīng)的函數(shù)即可。例如,下面的代碼:【例8.5】編寫一個(gè)Qt應(yīng)用程序,演示QSqlTableModel數(shù)據(jù)模型的使用方法。(1)復(fù)制例8.4中的examp8_4項(xiàng)目,將項(xiàng)目名稱修改為examp8_5。(2)啟動(dòng)QtCreator集成開發(fā)環(huán)境,打開項(xiàng)目examp8_5,將主窗口標(biāo)題修改為“例8.5”。(3)打開mainwindow.cpp文件,修改槽函數(shù)on_action_open_triggered()中的代碼如下所示。將原代碼中的:

model=newQSqlQueryModel(this);model->setQuery("select*fromstudents");修改為:

model=newQSqlTableModel(this);model->setTable("students");model->select();(4)構(gòu)建并運(yùn)行程序。3、QSqlRelationalTableModelQSqlRelationalTableModel繼承自QSqlTableModel類,并且對(duì)其進(jìn)行了擴(kuò)展,提供了對(duì)數(shù)據(jù)表中外鍵的支持。也就是說,QSqlRelationalTableModel是可以處理關(guān)系數(shù)據(jù)表的數(shù)據(jù)模型。QSqlRelationalTableModel類的主要函數(shù)與QSqlTableModel類相同。不同的是,它新增了一個(gè)名為setRelation()成員函數(shù),用于設(shè)置外鍵的關(guān)聯(lián)數(shù)據(jù)表和關(guān)聯(lián)字段?!纠?.6】編寫一個(gè)Qt應(yīng)用程序,演示QSqlRelationalTableModel數(shù)據(jù)模型的使用方法。(1)創(chuàng)建一個(gè)名為qt_examp8_6db的MySQL數(shù)據(jù)庫,并在庫中創(chuàng)建students、departments和majors三張數(shù)據(jù)表。數(shù)據(jù)表字段名稱及測(cè)試數(shù)據(jù)如圖8.14~8.16所示。(2)復(fù)制例8.5中的examp8_5項(xiàng)目,將項(xiàng)目名稱修改為examp8_6。(3)啟動(dòng)QtCreator集成開發(fā)環(huán)境,打開項(xiàng)目examp8_5,將主窗口標(biāo)題修改為“例8.6”。(4)打開mainwindow.cpp文件,修改槽函數(shù)MainWindow::on_action_open_triggered()中的代碼,如下所示。(5)構(gòu)建并運(yùn)行程序。8.3代理組件在Qt的數(shù)據(jù)模型/視圖結(jié)構(gòu)中,代理組件主要用于數(shù)據(jù)的編輯,分為缺省代理和自定義代理兩大類。8.3.1缺省代理一般情況下,模型/視圖結(jié)構(gòu)中的視圖組件都會(huì)提供一個(gè)缺省的代理組件,來實(shí)現(xiàn)視圖與數(shù)據(jù)模型之間數(shù)據(jù)的同步更新。8.3.1缺省代理【例8.7】一個(gè)簡(jiǎn)單的缺省代理應(yīng)用實(shí)例。(1)復(fù)制例8.5中的項(xiàng)目examp8_5,并將名稱修改為examp8_7。(2)啟動(dòng)QtCreator集成開發(fā)環(huán)境,打開項(xiàng)目examp8_7。為項(xiàng)目中添加2個(gè)新的工具欄按鈕,其中“保存”按鈕用于手動(dòng)保存數(shù)據(jù)的更改;“撤銷”按鈕用于取消數(shù)據(jù)在保存之前的更改操作。為視圖組件tableView添加一個(gè)雙擊信號(hào)的槽函數(shù)on_tableView_doubleClicked()。(3)打開mainwindow.cpp文件,在槽函數(shù)on_action_open_triggered()中添加如下代碼,設(shè)置數(shù)據(jù)模型的數(shù)據(jù)保存方式。model->setEditStrategy(QSqlTableModel::OnManualSubmit);QSqlTableModel::OnManualSubmit為手動(dòng)數(shù)據(jù)保存方式。(4)在槽函數(shù)on_action_save_triggered()、on_action_undo_triggered()和on_tableView_doubleClicked()中編寫代碼,實(shí)現(xiàn)數(shù)據(jù)保存及撤銷功能。如下所示。(5)構(gòu)建并運(yùn)行程序。8.3.2自定義代理在一般的情況下,Qt模型/視圖結(jié)構(gòu)中的缺省代理編輯器可以滿足應(yīng)用程序開發(fā)的需要,但有時(shí)候仍然顯得不夠靈活。例如,雙擊圖8.17中的“性別”數(shù)據(jù)單元格,顯示的是QLineEdit類型的缺省代理編輯組件,對(duì)于枚舉類型的數(shù)據(jù)使用文本框輸入就不是很方便。此時(shí),需要自己定義一個(gè)合適的代理編輯組件,比如QComboBox組合框組件,如圖8.18所示?!纠?.8】一個(gè)簡(jiǎn)單的自定義代理實(shí)例。本實(shí)例程序在例8.7項(xiàng)目基礎(chǔ)上實(shí)現(xiàn),運(yùn)行結(jié)果如圖8.18所示。(1)復(fù)制例8.7中的項(xiàng)目examp8_7,將項(xiàng)目名稱修改為examp8_8。(2)啟動(dòng)QtCreator集成開發(fā)環(huán)境,打開項(xiàng)目examp8_8。在項(xiàng)目中添加一個(gè)名為ComboDelegate的C++類。(3)在類ComboDelegate中添加4個(gè)公有成員函數(shù),分別為createEditor()、setEditorData()、setModelData()和updateEditorGeometry()。(4)在類ComboDelegate的實(shí)現(xiàn)文件中編寫代碼,實(shí)現(xiàn)自定義的4個(gè)成員函數(shù)的功能。(5)打開mainwindow.h文件,在MainWindow類添加一個(gè)私有的ComboDelegate對(duì)象。如下所示。private:ComboDelegatecomboDelegate;接著,打開mainwindow.cpp文件,在槽函數(shù)on_action_open_triggered()中添加代碼,為視圖組件添加自定義的代理組件。如下所示。ui->tableView->setItemDelegateForColumn(3,&comboDelegate);(6)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論