翻譯|使用教程|編輯:顏馨|2023-05-19 14:02:47.490|閱讀 148 次
概述:本章講述Qt可編輯樹模型的示例(二),歡迎閱讀~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發(fā)工具。它不僅完全實現(xiàn)了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運用于超過70個行業(yè)、數(shù)千家企業(yè),支持數(shù)百萬設備及應用。
The Qt Company是Digia Plc旗下的全資子公司。負責所有Qt活動,包括產(chǎn)品開發(fā),商業(yè)和開源授權模式以及在開放管理模式下的Qt工程。其許可、支持和服務能力能夠和開發(fā)者緊密合作以確保他們的Qt項目準時部署,不超預算并擁有競爭優(yōu)勢。
Qt技術交流群:166830288
該類提供包含多個數(shù)據(jù)的簡單項,包括有關其父項和子項的信息:TreeItem
class TreeItem { public: explicit TreeItem(const QList<QVariant> &data, TreeItem *parent = nullptr); ~TreeItem(); TreeItem *child(int number); int childCount() const; int columnCount() const; QVariant data(int column) const; bool insertChildren(int position, int count, int columns); bool insertColumns(int position, int columns); TreeItem *parent(); bool removeChildren(int position, int count); bool removeColumns(int position, int columns); int childNumber() const; bool setData(int column, const QVariant &value); private: QList<TreeItem *> childItems; QList<QVariant> itemData; TreeItem *parentItem; };
我們將 API 設計為類似于 QAbstractItemModel 提供的 API,為每個項目提供返回信息列數(shù)、讀取和寫入數(shù)據(jù)以及插入和刪除列的函數(shù)。但是,我們通過提供處理“子”而不是“行”的函數(shù)來明確項目之間的關系。
每個項都包含一個指向子項的指針列表、一個指向其父項的指針,以及一個 QVariant 對象列表,這些對象對應于模型中給定行的列中保存的信息。
每個都由數(shù)據(jù)列表和一個可選的父項構造:TreeItem
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent) : itemData(data), parentItem(parent) {}
最初,每個項目都沒有子項。這些函數(shù)使用后面介紹的函數(shù)添加到項的內(nèi)部成員中。childItemsinsertChildren()
析構函數(shù)確保在刪除項本身時刪除添加到項的每個子項:
TreeItem::~TreeItem() { qDeleteAll(childItems); }
由于每個項目都存儲指向其父項的指針,因此該函數(shù)很簡單:parent()
TreeItem *TreeItem::parent() { return parentItem; }
三個函數(shù)提供有關項的子項的信息。 從內(nèi)部子項列表中返回特定的子項:child()
TreeItem *TreeItem::child(int number) { if (number < 0 || number >= childItems.size()) return nullptr; return childItems.at(number); }
該函數(shù)返回子項的總數(shù):childCount()
int TreeItem::childCount() const { return childItems.count(); }
該函數(shù)用于確定子項在其父項的子項列表中的索引。它直接訪問父級的成員以獲取此信息:childNumber()childItems
int TreeItem::childNumber() const { if (parentItem) return parentItem->childItems.indexOf(const_cast<TreeItem*>(this)); return 0; }
根項沒有父項;對于此項,我們返回零以與其他項保持一致。
該函數(shù)僅返回 QVariant 對象內(nèi)部列表中的元素數(shù):columnCount()itemData
int TreeItem::columnCount() const { return itemData.count(); }
使用函數(shù)檢索數(shù)據(jù),該函數(shù)訪問列表中的相應元素:data()itemData
QVariant TreeItem::data(int column) const { if (column < 0 || column >= itemData.size()) return QVariant(); return itemData.at(column); }
數(shù)據(jù)是使用函數(shù)設置的,該函數(shù)僅將有效列表索引的值存儲在列表中,對應于模型中的列值:setData()itemData
bool TreeItem::setData(int column, const QVariant &value) { if (column < 0 || column >= itemData.size()) return false; itemData[column] = value; return true; }
為了使模型的實現(xiàn)更容易,我們返回 true 以指示數(shù)據(jù)已成功設置。
可編輯模型通常需要調(diào)整大小,以便插入和刪除行和列。在模型中給定模型索引下插入行會導致在相應的項中插入新的子項,由以下函數(shù)處理:insertChildren()
bool TreeItem::insertChildren(int position, int count, int columns) { if (position < 0 || position > childItems.size()) return false; for (int row = 0; row < count; ++row) { QList<QVariant> data(columns); TreeItem *item = new TreeItem(data, this); childItems.insert(position, item); } return true; }
這可確保使用所需列數(shù)創(chuàng)建新項,并將其插入到內(nèi)部列表中的有效位置。使用以下函數(shù)刪除項目:childItemsremoveChildren()
bool TreeItem::removeChildren(int position, int count) { if (position < 0 || position + count > childItems.size()) return false; for (int row = 0; row < count; ++row) delete childItems.takeAt(position); return true; }
如上所述,用于插入和刪除列的函數(shù)與用于插入和刪除子項的函數(shù)使用方式不同,因為它們應該在樹中的每個項上調(diào)用。我們通過在項目的每個子項上遞歸調(diào)用此函數(shù)來實現(xiàn)這一點:
bool TreeItem::insertColumns(int position, int columns) { if (position < 0 || position > itemData.size()) return false; for (int column = 0; column < columns; ++column) itemData.insert(position, QVariant()); for (TreeItem *child : std::as_const(childItems)) child->insertColumns(position, columns); return true; }
歡迎下載|體驗更多Qt產(chǎn)品
獲取更多信息請咨詢 ;Qt技術交流群:166830288
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn