翻譯|使用教程|編輯:顏馨|2023-05-12 13:53:40.583|閱讀 244 次
概述:本章講述Qt小部件:可編輯樹模型的示例,歡迎查閱~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt 是目前最先進(jìn)、最完整的跨平臺(tái)C++開發(fā)工具。它不僅完全實(shí)現(xiàn)了一次編寫,所有平臺(tái)無差別運(yùn)行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運(yùn)用于超過70個(gè)行業(yè)、數(shù)千家企業(yè),支持?jǐn)?shù)百萬設(shè)備及應(yīng)用。
The Qt Company是Digia Plc旗下的全資子公司。負(fù)責(zé)所有Qt活動(dòng),包括產(chǎn)品開發(fā),商業(yè)和開源授權(quán)模式以及在開放管理模式下的Qt工程。其許可、支持和服務(wù)能力能夠和開發(fā)者緊密合作以確保他們的Qt項(xiàng)目準(zhǔn)時(shí)部署,不超預(yù)算并擁有競(jìng)爭(zhēng)優(yōu)勢(shì)。
Qt技術(shù)交流群:166830288
此示例演示如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的基于項(xiàng)的樹模型,該模型可與模型/視圖框架的其他類一起使用。
該模型支持可編輯項(xiàng)、自定義標(biāo)題以及插入和刪除行和列的功能。使用這些功能,還可以插入新的子項(xiàng),這在支持的示例代碼中顯示。
如模型子類化參考中所述,模型必須為標(biāo)準(zhǔn)模型函數(shù)集提供實(shí)現(xiàn):flags()、data()、headerData()、columnCount() 和 rowCount()。此外,分層模型,比如這個(gè),需要提供 index() 和 parent() 的實(shí)現(xiàn)。
可編輯模型需要提供 setData() 和 setHeaderData() 的實(shí)現(xiàn),并且必須從其 flags() 函數(shù)返回合適的標(biāo)志組合。
由于這個(gè)例子允許改變模型的維度,我們還必須實(shí)現(xiàn)insertRows(),insertColumns(),removeRows()和removeColumns()。
與簡(jiǎn)單樹模型示例一樣,該模型只是充當(dāng)類實(shí)例集合的包裝器。每個(gè)都旨在保存樹視圖中一行項(xiàng)目的數(shù)據(jù),因此它包含與每列中顯示的數(shù)據(jù)對(duì)應(yīng)的值列表。
由于 QTreeView 為模型提供了面向行的視圖,因此很自然地為數(shù)據(jù)結(jié)構(gòu)選擇面向行的設(shè)計(jì),該設(shè)計(jì)將通過模型向此類視圖提供數(shù)據(jù)。盡管這使得樹模型不太靈活,并且對(duì)于用于更復(fù)雜的視圖可能不太有用,但它使設(shè)計(jì)變得不那么復(fù)雜,并且更易于實(shí)現(xiàn)。
在設(shè)計(jì)用于自定義模型的數(shù)據(jù)結(jié)構(gòu)時(shí),通過 TreeItem::p arent() 等函數(shù)公開每個(gè)項(xiàng)的父項(xiàng)很有用,因?yàn)樗鼘⑹咕帉懩P妥约旱?parent() 函數(shù)更容易。類似地,像 TreeItem::child() 這樣的函數(shù)在實(shí)現(xiàn)模型的 index() 函數(shù)時(shí)很有幫助。因此,每個(gè)都維護(hù)有關(guān)其父級(jí)和子級(jí)的信息,使我們能夠遍歷樹結(jié)構(gòu)。該圖顯示了實(shí)例如何通過其 parent() 和 child() 函數(shù)進(jìn)行連接。
在所示的示例中,可以通過調(diào)用其 child() 函數(shù)從根項(xiàng)獲取兩個(gè)頂級(jí)項(xiàng) A 和 B,并且這些項(xiàng)中的每一個(gè)都從其 parent() 函數(shù)返回根節(jié)點(diǎn),盡管這僅針對(duì)項(xiàng) A 顯示。
每個(gè)都在其私有成員(QVariant 對(duì)象列表)中表示的行中存儲(chǔ)每一列的數(shù)據(jù)。由于視圖中的每一列和列表中的每個(gè)條目之間存在一對(duì)一的映射,因此我們提供了一個(gè)簡(jiǎn)單的 data() 函數(shù)來讀取列表中的條目,并提供了一個(gè) setData() 函數(shù)來允許修改它們。與項(xiàng)目中的其他函數(shù)一樣,這簡(jiǎn)化了模型的 data() 和 setData() 函數(shù)的實(shí)現(xiàn)。
我們將一個(gè)項(xiàng)目放在項(xiàng)目樹的根目錄中。此根項(xiàng)對(duì)應(yīng)于空模型索引 QModelIndex(),該索引用于在處理模型索引時(shí)表示頂級(jí)項(xiàng)的父項(xiàng)。盡管根項(xiàng)在任何標(biāo)準(zhǔn)視圖中都沒有可見的表示形式,但我們使用其內(nèi)部 QVariant 對(duì)象列表來存儲(chǔ)字符串列表,這些字符串將傳遞給視圖以用作水平標(biāo)題。
在圖中所示的情況下,可以使用標(biāo)準(zhǔn)模型/視圖 API 獲取由 a 表示的信息片段:
QVariant a = model->index(0, 0, QModelIndex()).data();
由于每個(gè)項(xiàng)目都包含給定行中每一列的數(shù)據(jù)片段,因此可以有許多映射到同一對(duì)象的模型索引。例如,可以使用以下代碼獲取 b 表示的信息:TreeItem
QVariant b = model->index(1, 0, QModelIndex()).data();
同樣的底層將被訪問以獲得與b.TreeItem相同行的其他模型索引的信息。
在模型類中,當(dāng)我們?cè)?index() 和 parent() 實(shí)現(xiàn)中使用 QAbstractItemModel::createIndex() 創(chuàng)建相應(yīng)的模型索引時(shí),我們通過為每個(gè)項(xiàng)目傳遞一個(gè)指針來將對(duì)象與模型索引相關(guān)聯(lián)。我們可以通過在相關(guān)模型索引上調(diào)用 internalPointer() 函數(shù)來檢索以這種方式存儲(chǔ)的指針 - 我們創(chuàng)建自己的 getItem() 函數(shù)來為我們完成工作,并從我們的 data() 和 parent() 實(shí)現(xiàn)中調(diào)用它。
當(dāng)我們控制項(xiàng)目的創(chuàng)建和銷毀方式時(shí),存儲(chǔ)指向項(xiàng)目的指針很方便,因?yàn)槲覀兛梢约僭O(shè)從 internalPointer() 獲得的地址是有效的指針。但是,某些模型需要處理從系統(tǒng)中的其他組件獲取的項(xiàng),并且在許多情況下,無法完全控制項(xiàng)的創(chuàng)建或銷毀方式。在這種情況下,純基于指針的方法需要輔以保護(hù)措施,以確保模型不會(huì)嘗試訪問已刪除的項(xiàng)目。
幾段數(shù)據(jù)作為 QVariant 對(duì)象存儲(chǔ)在每個(gè)實(shí)例的成員中。
該圖顯示了由前兩個(gè)圖中的標(biāo)簽 a、b 和 c 表示的信息片段如何存儲(chǔ)在基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)中的項(xiàng)目 A、B 和 C 中。請(qǐng)注意,模型中同一行的信息片段都是從同一項(xiàng)目獲取的。列表中的每個(gè)元素對(duì)應(yīng)于模型中給定行中每列公開的一條信息。
由于該實(shí)現(xiàn)是為與 QTreeView 一起使用而設(shè)計(jì)的,因此我們對(duì)其使用實(shí)例的方式添加了限制:每個(gè)項(xiàng)目必須公開相同數(shù)量的數(shù)據(jù)列。這使得查看模型保持一致,允許我們使用根項(xiàng)來確定任何給定行的列數(shù),并且僅添加創(chuàng)建包含足夠列數(shù)數(shù)據(jù)的項(xiàng)的要求。因此,插入和刪除列是耗時(shí)的操作,因?yàn)槲覀冃枰闅v整個(gè)樹來修改每個(gè)項(xiàng)目。
另一種方法是設(shè)計(jì)類,以便在修改數(shù)據(jù)項(xiàng)時(shí)截?cái)嗷驍U(kuò)展單個(gè)實(shí)例中的數(shù)據(jù)列表。但是,這種“懶惰”的大小調(diào)整方法只允許我們?cè)诿啃械哪┪膊迦牒蛣h除列,而不允許在每行的任意位置插入或刪除列。
與簡(jiǎn)單樹模型示例一樣,需要能夠獲取模型索引,找到相應(yīng)的 ,并返回與其父項(xiàng)和子項(xiàng)對(duì)應(yīng)的模型索引。
在圖中,我們展示了模型的 parent() 實(shí)現(xiàn)如何使用上圖中顯示的項(xiàng)獲取與調(diào)用方提供的項(xiàng)的父項(xiàng)對(duì)應(yīng)的模型索引。
指向項(xiàng) C 的指針是使用 QModelIndex::internalPointer() 函數(shù)從相應(yīng)的模型索引中獲取的。指針在創(chuàng)建時(shí)存儲(chǔ)在索引內(nèi)部。由于子項(xiàng)包含指向其父項(xiàng)的指針,因此我們使用其 parent() 函數(shù)來獲取指向項(xiàng) B 的指針。父模型索引是使用 QAbstractItemModel::createIndex() 函數(shù)創(chuàng)建的,將指向項(xiàng) B 的指針作為內(nèi)部指針傳遞。
歡迎下載|體驗(yàn)更多Qt產(chǎn)品
獲取更多信息請(qǐng)咨詢 ;Qt技術(shù)交流群:166830288
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn