版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、本節(jié)介紹QStandardItemModel的使用,主要用到以下 3個(gè)類:1.QStandardItemModel:基于項(xiàng)數(shù)據(jù)的標(biāo)準(zhǔn)數(shù)據(jù)模型,可以處理二維數(shù)據(jù)。維護(hù) 一個(gè)二維的項(xiàng)數(shù)據(jù)數(shù)組,每個(gè)項(xiàng)是一個(gè)QSta ndarditem 類的變量,用于存儲(chǔ)項(xiàng)的數(shù)據(jù)、字體格式、對(duì)齊方式等。2.QTableView:二維數(shù)據(jù)表視圖組件,有多個(gè)行和多個(gè)列,每個(gè)基本顯示單元是 一個(gè)單元格,通過(guò)setModelO函數(shù)設(shè)置一個(gè)QStandardItemModel類的數(shù)據(jù)模型之后,一個(gè)單元格顯示 QStandardItemModel數(shù)據(jù)模型中的一個(gè)項(xiàng)。3.QItemSelectionModel :個(gè)用于跟蹤視圖組件
2、的單元格選擇狀態(tài)的類,當(dāng)在QTableView選擇某個(gè)單元格,或多個(gè)單元格時(shí),通過(guò)QItemSelectio nM odel可以獲得選中的單元格的模型索引,為單元格的選擇操作提供方便。這幾個(gè)類之間的關(guān)系是:QTableView是界面視圖組件,其關(guān)聯(lián)的數(shù)據(jù)模型是 QStandarditem Model,關(guān)聯(lián)的項(xiàng)選擇模型是 QItemSelectionModel , QStandardItemModel的數(shù)據(jù)管理的基本單元是 QStandarditem 。實(shí)例中演示QStandardItemModel的使用,其運(yùn)行時(shí)界面如圖1所示。 QTabJeViewStandardltemlVlodel- X
3、+AXfl增(tPlainTFrtTdit萬(wàn)E n垂劇2非阿2522n.270.51it11 2S2241,2?0,51275L-n. 27it13002; 5, S3良12 2丁52750.7;3252-9, 23h騁1350243,1)2L27-船1i 3003M2詰竝n.g375245, 25-般1pg g2*3.12it1魁.祀2.R, 72Lt14 325325239.231.09242.5127 A.弓2辰1、35U350西3血1.27麗n不附用-職5益27.-職|-6 375375245.251.43550誹用249. 55優(yōu)P53律笹ii07 400聊刖243.1;17?8仍斗
4、凸刖238J21J39 450449.99242.62.2210 47S474.992迪氐3.51Vset upU i(this);setCe ntralWidget(ui-s plitter);theModel = new QSta ndardItemModel (2, FixedColu mn Cou nt, this) ; / 數(shù)據(jù)模型 theSelection = new QItemSelectionModel (theModel) ;/ 選擇模型 conn ect(theSelectio n,SIGNAL(curre ntCha nged(QModell ndex,QModell n
5、dex), this,SLOT(on_curre ntCha nged(QModell ndex,QModell ndex);ui-tableView-setModel (theModel) ; / 設(shè)置數(shù)據(jù)模型 ui-tableVi.evi- setSelectio nM odel(theSelectio n) ; / 設(shè)置選擇模型 ui-tableView-setSelect ionM ode(QAbstractltemView:Exte ndedSelect ion); ui-tableView-setSelectio nBehavior(QAbstractltemView:Select
6、ltems);/創(chuàng)建狀態(tài)欄組件,代碼略在構(gòu)造函數(shù)里首先創(chuàng)建數(shù)據(jù)模型theModel,創(chuàng)建數(shù)據(jù)選擇模型時(shí)需要傳遞 一個(gè)數(shù)據(jù)模型變量作為其參數(shù)。這樣,數(shù)據(jù)選擇模型theSelecti on就與數(shù)據(jù)模型theModel關(guān)聯(lián),用于表示theModel的項(xiàng)數(shù)據(jù)選擇操作。創(chuàng)建數(shù)據(jù)模型 和選擇模型后,為TableView 組件設(shè)置數(shù)據(jù)模型和選擇模型:設(shè)置選擇模型ui-tableView-setModel (theModel) ; /設(shè)置數(shù)據(jù)模型ui-tableView-setSelectio nM odel (theSelectio n) ; /與 theSelect ion選擇單元格發(fā)生變化構(gòu)造函數(shù)里還將
7、自定義的槽函數(shù) on_curre ntCha nged() 的curre ntCha nged()信號(hào)關(guān)聯(lián),用于界面上tableView時(shí),顯示單元格的行號(hào)、列號(hào)、內(nèi)容等信息,槽函數(shù)代碼如下:void MainWin dow:o n_curre ntCha nged(c onst QModell ndex &curre nt, const QModell ndex &p revious) /選擇單元格變化時(shí)的響應(yīng)if (curre nt.isValid()LabCellPos-setText (QString:asprintf (當(dāng)前單元格: d 行, d 列,curre nt.row(),c
8、urre nt.colu mn();QSta ndarditem* altem=theModel-itemFroml ndex(curre nt); this-LabCellText-setText (” 單元格內(nèi)容:+altem-text(); QFont fon t=altem-fo nt();ui-actFo ntBold-setChecked(fo nt.bold();從文本文件導(dǎo)入數(shù)據(jù)QStandardltemModel是標(biāo)準(zhǔn)的基于項(xiàng)數(shù)據(jù)的數(shù)據(jù)模型,以類似于二維數(shù)組 的形式管理內(nèi)部數(shù)據(jù),適合于處理表格型數(shù)據(jù),其顯示一般采用QTableView。QSta ndardltemModel的
9、數(shù)據(jù)可以是程序生成的內(nèi)存中的數(shù)據(jù),也可以來(lái)源于文件。例如,在實(shí)際數(shù)據(jù)處理中,有些數(shù)據(jù)經(jīng)常是以純文本格式保存的,它 們有固定的列數(shù),每一列是一項(xiàng)數(shù)據(jù),實(shí)際構(gòu)成一個(gè)二維數(shù)據(jù)表。百曬 AlblLi TTg方待2&251.270.1275275241.270-723003002iS 9立o g35233.231-09J to3501 27J75i7525 2&1 443曲勺邸2-13.121 72磋5424991-954503*99壬左衛(wèi)44KQ eoS旳522 51500.3 3賂1237 27121百0旨10 9a3 76S75254 774出t-Hte rt匕*幷 s 冋優(yōu)直fl自一純文本格式的
10、數(shù)據(jù)文件F面是“打開文件”按鈕的槽函數(shù)代碼:void Mai nWin dow:o n_act Open _triggered() /打開文件/QStri ng str;QStri ng curPath=QCoreA pp licatio n:a ppi icatio nDirPath(); /調(diào)用打開文件對(duì)話框打開一個(gè)文件QStri ng aFileName=QFileDialog:get OpenF ileName(this, 件(*.txt);所有文件(*.*);if (aFileName.isE mp ty()return; /如果未選擇文件,退出獲取應(yīng)用程序的路徑打開一個(gè)文件”,cu
11、rPath,井?dāng)?shù)據(jù)文QStringList fFileContent;/文件內(nèi)容字符串列表QFile aFile(aFileName); / 以文件方式讀出if (aFile.o pen (QIODevice:Read Only | QIODevice:Text) / 以只讀文本方式打開文件QTextStream aStream(&aFile); / 用文本流讀取文件ui-plainTextEdit-clear();/ 清空while (!aStream.atE nd()QString str=aStream.readLine();/ 讀取文件的一行ui- plai nTextEdit-a p
12、pendP la in Text(str); / 添加到文本框顯示 fFileContent.append(str); / 添加到 StringListaFile.close();/ 關(guān)閉文件this-LabCurFile-setText(當(dāng)前文件:+aFileName);/ 狀態(tài)欄顯示 ui-actAppend-setEnabled(true); / 更新 Actions 的 enable 屬性 ui-act In sert-setE nabled(true);ui-actDelete-setE nabled(true); ui-actSave-setE nabled(true);iniMo
13、delFromStringList(fFileContent);/ 從 StringList 的內(nèi)容初始化數(shù)據(jù)模型這段代碼讓用戶選擇所需要打開的數(shù)據(jù)文本文件,然后用只讀和文本格式打開文件,逐行讀取其內(nèi)容,將每行字符串顯示到界面上的P la in TextEdit 里,.并且添加到一個(gè)臨時(shí)的QStringList類型的變量fFileContent里。用 fFileCo ntent 的內(nèi)函數(shù)的代碼:Stri ngList然后調(diào)用自定義函數(shù)iniModelFromStringList() 容初始化數(shù)據(jù)模型。下面是in iModelFromStri ngList()void Mai nWin dow:
14、i niModelFromStri ngList(QStri ngList & aFileCo nte nt) /從一個(gè)StringList獲取數(shù)據(jù),初始化數(shù)據(jù)Modelint rowCnt=aFileContent.count(); / 文本行數(shù),第 1 行是標(biāo)題 theModel-setRowCount(rowCnt-1); / 實(shí)際數(shù)據(jù)行數(shù) /設(shè)置表頭QString header=aFileContent.at(O);/ 第 1 行是表頭一個(gè)或多個(gè)空格、TAB等分隔符隔開的字符串,分解為一個(gè)QStri ngList headerList=header.s plit(QRegEx p(s+
15、),QStri ng:Ski pEmptyP arts); theModel-setHorizontalHeaderLabels(headerList); / 設(shè)置表頭文字/設(shè)置表格數(shù)據(jù)QStri ng aText;QStri ngList tmp List;int j;QSta ndarditem *altem; for (int i=1;irowC nt;i+) QString aLineText=aFileContent.at(i); / 獲取數(shù)據(jù)區(qū)的一行一個(gè)或多個(gè)空格、TAB等分隔符隔開的字符串,分解為一個(gè)StringListQStri ngList tmp List=aLi neTe
16、xt.s plit(QRegEx p(s+),QStri ng:Ski pEmptyP arts);for (j=0;jsetltem(i-1,j,altem); / 為模型的某個(gè)行列位置設(shè)置ItemaItem=new QStandardltem(headerList.at(j);/ 最后一列是 Checkable,需要設(shè)置 /aItem=new QStandardltem();/ 最后一列是 Checkable,設(shè)置 aItem-setCheckable(true); / 設(shè)置為 Checkable/aItem-setTextAlig nmen t(Qt:Alig nH Ce nter);i
17、f (tmp List.at(j)=0)altem-setCheckState(Qt:Unchecked); / 根據(jù)數(shù)據(jù)設(shè)置 check 狀態(tài) elseaItem-setCheckState(Qt:Checked);theModel-setItem(i-1,j,aItem); / 為模型的某個(gè)行列位置設(shè)置Item傳遞來(lái)的參數(shù)aFileContent是文本文件所有行構(gòu)成的StringList ,文件的每一行是 aFileContent的一行字符串,第 1 行是表頭文字,數(shù)據(jù)從第 2行開始。程序首先獲取字符串列表的行數(shù),然后設(shè)置數(shù)據(jù)模型的行數(shù),因?yàn)閿?shù)據(jù)模 型的列數(shù)在初始化時(shí)己經(jīng)設(shè)置了。然后獲取字
18、符串列表的第1行,即表頭文字,用QSqing:split()函數(shù)分割成一個(gè) QStringList ,設(shè)置為數(shù)據(jù)模型的表頭標(biāo)題。QStri ng:s plit()函數(shù)根據(jù)某個(gè)特定的符號(hào)將字符串進(jìn)行分割。例如,header是數(shù)據(jù)列的標(biāo)題,每個(gè)標(biāo)題之間通過(guò)一個(gè)或多個(gè) TAB鍵分隔,其內(nèi)容是:測(cè)深(m 垂深(m 方位() 總位移(m 固井質(zhì)量 測(cè)井取樣那么通過(guò)上面的 split()函數(shù)操作,得到一個(gè)字符串列表headerList ,其內(nèi)容是: 測(cè)深(m 垂深(m 方位() 總位移(m 固井質(zhì)量 測(cè)井取樣也就是分解為一個(gè)6行的StringList 。然后使用此字符串列表作為數(shù)據(jù)I 模型,設(shè)置表頭標(biāo)題的
19、函數(shù) setHorizo ntalHeaderLabels()的參數(shù),就可以為數(shù)據(jù)模型設(shè)置表頭了。同樣,在逐行獲取字符串后,也采用 spl it() 函數(shù)進(jìn)行分解,為每個(gè)數(shù)據(jù) 創(chuàng)建一個(gè)QStandardltem 類型的項(xiàng)數(shù)據(jù)altem,并賦給數(shù)據(jù)模型作為某行某列 的項(xiàng)數(shù)據(jù)。QSta ndardItemModel以二維表格的形式保存項(xiàng)數(shù)據(jù),每個(gè)項(xiàng)數(shù)據(jù)對(duì)應(yīng)著QTableView的一個(gè)單元格。項(xiàng)數(shù)據(jù)不僅可以存儲(chǔ)顯示的文字,還可以存儲(chǔ)其他 角色的數(shù)據(jù)。數(shù)據(jù)文件的最后一列是一個(gè)邏輯型數(shù)據(jù),在 tableView 上顯示時(shí)為其提供 一個(gè) CheckBox 組件,此功能通過(guò)調(diào)用 QStandardltem
20、的 setCheckableQ 函 數(shù)實(shí)現(xiàn)。數(shù)據(jù)修改當(dāng)TableView 設(shè)置為可編輯時(shí),雙擊一個(gè)單元格可以修改其內(nèi)容,對(duì)于使 用CheckBox的列,改變CheckBox的勾選狀態(tài),就可以修改單元格關(guān)聯(lián)項(xiàng)的 選擇狀態(tài)。在實(shí)例主窗口工具欄上有“添加行”、“插入行”、“刪除行”按 鈕,它們實(shí)現(xiàn)相應(yīng)的編輯操作,這些操作都是直接針對(duì)數(shù)據(jù)模型的,數(shù)據(jù)模型 被修改后,會(huì)直接在TableView上顯示出來(lái)。添加行“添加行”操作是在數(shù)據(jù)表的最后添加一行,其實(shí)現(xiàn)代碼如下:void MainWin dow:o n_actA ppen d_triggered() /在表格最后添加行QListvQStandardl
21、tem* altemList; / 容器類QSta ndarditem *aItem;for(i nt i=0;iFixedColu mn Cou nt-1;i+) / 不包含最后 1 列 aItem=new QStandardltem(O); / 創(chuàng)建 Item aItemListheaderData(theModel-colu mn Cou nt()- 1,Qt:Horizo ntal,Qt:Dis playRole).toStri ng();aItem=new QStandardltem(str); / 創(chuàng)建”測(cè)井取樣Item altem-setCheckable(true);aItem
22、ListinsertRow(theModel-rowCount(),altemList); /插入一行,需要每個(gè) Cell 的 ltemQModell ndex curln dex=theModel- in dex(theModel-rowCou nt()-1,O);/創(chuàng)建最后一行的Modell ndextheSelection-clearSelection();/ 清空選擇項(xiàng)theSelectio n-setCurre ntIn dex(curl ndex,QltemSelectio nModel:Select);/ 設(shè)置剛插入的行為當(dāng) 前選擇行使用QSta ndardltemModel:i
23、 nsertRow()函數(shù)插入一行,其函數(shù)原型是:void in sertRow(i nt row, const QListvQSta ndarditem * fiitems)其中,row是一個(gè)行號(hào),表示在此行號(hào)之前插入一行,若row等于或大于總行數(shù),則在最后添加一行。QListvQSta ndardltem *&i tems 是一個(gè) QStandardltem類型的列表類,需要為插入的一行的每個(gè)項(xiàng)數(shù)據(jù)創(chuàng)建一個(gè) QStandardltem類型的項(xiàng),然后傳遞給insertRow()函數(shù)。在這段程序中,為前5列創(chuàng)建QStandardltem 對(duì)象時(shí),都使用文字“ 0” 最后一列使用表頭的標(biāo)題,并設(shè)
24、置為 Checkable。創(chuàng)建完每個(gè)項(xiàng)數(shù)據(jù)對(duì)象后, 使用in sertRowO函數(shù)在最后添加一行。|插入行“插入行”按鈕的功能是在當(dāng)前行的前面插入一行,實(shí)現(xiàn)代碼與“添加行”類 似。刪除行號(hào),調(diào)用“刪除行”按鈕的功能是刪除當(dāng)前行,首先從選擇模型中獲取當(dāng)前單元格 的模型索引,然后從模型索引中獲取行號(hào),調(diào)用removeRow(i nt row) 刪除指定的行。void MainWin dow:o n_actDelete_triggered() /刪除行QModell ndex curin dex=theSelectio n-curre ntl ndex () ;/ 獲取模型索引if (curin d
25、ex. row () =theModel-rowCou nt () -1) /最后一行theModel-removeRow (curin dex.row () ) ; / 刪除最后一行 else theModel-removeRow (curin dex.row () );/ 刪除一行,并重新設(shè)置當(dāng)前選擇行 theSelect ion-setCurre ntin dex (curl ndex, QltemSelect ionM odel:Select);單元格格式設(shè)置_工具欄上有3個(gè)設(shè)置單元格文字對(duì)齊方式的按鈕,還有一個(gè)設(shè)置字體粗體 的按鈕。當(dāng)在Tableview 中選擇多個(gè)單元格時(shí),可以同時(shí)
26、設(shè)置多個(gè)單元格的格 式。例如,“居左”按鈕的代碼如下:void Mai nWin dow:o n_actAlig nLeft_tnggered() /設(shè)置文字居左對(duì)齊if (!theSelectio n-hasSelectio n() return;/獲取選擇的單元格的模型索引列表,可以是多選QModelI ndexList selectedI ndex=theSelectio n-selectedl ndexes(); for (int i=0;iitemFr omin dex(a In dex); aItem-setTextAlig nmen t (Qt:Alig nLeft) ;/設(shè)置文
27、字對(duì)齊方式QltemSelectio nModel:selectedl ndexes()函數(shù)返回選擇單元格的模型索引列表,然后通過(guò)此列表獲取每個(gè)選擇的單元格的模型索引,再通過(guò)模型索引 獲取其項(xiàng)數(shù)據(jù),然后調(diào)用 QSta ndardItem:setTextAlig nmen t()設(shè)置一個(gè)項(xiàng)的對(duì)齊方式即可。“居中”和“居右”按鈕的代碼與此類似。_ “粗體”按鈕設(shè)置單元格的字體是否為粗體,在選擇單元格時(shí), actFontBold的check狀態(tài)根據(jù)當(dāng)前單元格的字體是否為粗體自動(dòng)更新。actFon tBold 的triggered(bool)的槽函數(shù)代碼如下,與設(shè)置對(duì)齊方式的代碼操作方式類似:void
28、 MainWin dow:o n_actF on tBold_tnggered(bool checked)/設(shè)置字體粗體-if (!theSelectio n-hasSelectio n() return;/獲取選擇單元格的模型索引列表QModelI ndexList selectedI ndex=theSelect ion-selectedl ndexes(); for (int i=0;iitemFroml ndex (aln dex);/ 獲取項(xiàng)數(shù)據(jù) QFont font=altem-font(); / 獲取字體font.setBold(checked); /設(shè)置字體是否粗體aItem-setFont(font); / 重新設(shè)置字體數(shù)據(jù)另存為文件在視圖組件上對(duì)數(shù)據(jù)的修改都會(huì)自動(dòng)更新到數(shù)據(jù)模型里,單擊工具欄上的 “模型數(shù)據(jù)預(yù)覽”按鈕,可以將數(shù)據(jù)模型的數(shù)據(jù)內(nèi)容顯示到Plain TextEdit里。數(shù)據(jù)模型里的數(shù)據(jù)是在內(nèi)存中的,工具欄上的“另存文件”按鈕可以將數(shù)據(jù)模型的數(shù)據(jù)另存 為一個(gè)數(shù)據(jù)文本文件,同時(shí)也顯示在 P lai nTextEdit里,其實(shí)現(xiàn)代碼如下:void Mai nWin dow:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年軟件開發(fā)知識(shí)產(chǎn)權(quán)服務(wù)合同范本
- 住宅買賣委托代理合同
- 施工場(chǎng)地文明施工責(zé)任書
- 【初中地理】第二章地圖基礎(chǔ)診斷卷 2024-2025學(xué)年人教版地理七年級(jí)上冊(cè)
- 人才發(fā)展合作方案協(xié)議
- 藝術(shù)家工作室合伙協(xié)議書樣本
- 專業(yè)庭院綠化施工合同示范
- 小產(chǎn)權(quán)房買賣合同匯編
- 2024年財(cái)務(wù)會(huì)計(jì)保密協(xié)議
- 投資公司勞務(wù)合同范本
- 江蘇省南通市2023-2024學(xué)年七上期中數(shù)學(xué)試題(解析版)
- 體育大單元教學(xué)計(jì)劃(18課時(shí))
- 讓小車運(yùn)動(dòng)起來(lái)說(shuō)課稿
- 2023-2024學(xué)年北京朝陽(yáng)區(qū)高三(上)期中數(shù)學(xué)試題和答案
- 工程招投標(biāo)管理與實(shí)踐作業(yè)指導(dǎo)書
- ISO 22003-1:2022《食品安全-第 1 部分:食品安全管理體系 審核與認(rèn)證機(jī)構(gòu)要求》中文版(機(jī)翻)
- 2024年消防月主題活動(dòng)方案啟動(dòng)及全員消防安全知識(shí)培訓(xùn)
- 高職組“智能財(cái)稅”賽項(xiàng)國(guó)賽賽題2022
- 期中考試卷(試題)-2024-2025學(xué)年蘇教版二年級(jí)數(shù)學(xué)上冊(cè)
- 2024年全國(guó)企業(yè)員工全面質(zhì)量管理知識(shí)競(jìng)賽題庫(kù)(含答案)(共132題)
- 社會(huì)工作者《社會(huì)工作綜合能力(中級(jí))》試題(附答案)
評(píng)論
0/150
提交評(píng)論