一,前言
上一篇25.自定義ItemModel到QTreeview--Apple的學(xué)習(xí)筆記我僅修改了treeitem,treemodel模塊沒有修改,所以treemodel中的回調(diào)函數(shù)到此是什么策略,還是不清楚,所以本次進行深度練習(xí)。
二,需求
自建數(shù)據(jù),通過抽象模塊綁定到treeview顯示,目的是弄明白這些回調(diào)函數(shù)的運行機制。
三,遇到的問題
固定的二維數(shù)組的數(shù)據(jù)無法正常顯示到treeview
答:僅能顯示第一層級的重復(fù)數(shù)據(jù)。原因是treeview model必須是鏈表形式的。若數(shù)據(jù)是固定二維數(shù)組直接在model無法找parent和child,若必須要用,則要將其封裝為鏈表形式,并且可以找到child和parent的形式。當(dāng)然若用tableview顯示則不需要parent和child了。parent和index含義
答:index是創(chuàng)建子類的,parent創(chuàng)建父節(jié)點的,每個子節(jié)點又可以作為其他的父節(jié)點。若為空說明是主節(jié)點。很簡單的操作方法就是將parent強制設(shè)置為默認值回復(fù),即所有index的父節(jié)點只有一個主節(jié)點了。顯示結(jié)果就是全部掛在父節(jié)點上一行行的顯示了。data和column及row的含義
答:data是顯示的最終數(shù)據(jù),一般可以原始數(shù)據(jù)顯示或加些算法再顯示,column和row就是返回當(dāng)前出入節(jié)點總共有幾行和幾列。
四,效果

a. 創(chuàng)建數(shù)據(jù)內(nèi)容
mytreemodel::mytreemodel(QObject *parent)
: QAbstractItemModel(parent)
{
// 創(chuàng)建root節(jié)點
m_pRootNode = new myitem(nullptr, "rootNode", -1, -1);
myitem *m_receiveInfo = new myitem(m_pRootNode, "ReceiveMessage", 0, 0);
myitem *m_replyInfo = new myitem(m_pRootNode, "ReplyMessage", 1, 0);
m_pRootNode->childNodes.append(m_receiveInfo);
m_pRootNode->childNodes.append(m_replyInfo);
myitem *m_relay1Info = new myitem(m_replyInfo, "r1", 0, 0);
myitem *m_relay2Info = new myitem(m_replyInfo, "r2", 1, 0);
myitem *m_relay3Info = new myitem(m_replyInfo, "r3", 2, 0);
m_replyInfo->childNodes.append(m_relay1Info);
m_replyInfo->childNodes.append(m_relay2Info);
m_replyInfo->childNodes.append(m_relay3Info);
}
b. 自建數(shù)據(jù)結(jié)構(gòu)
class myitem
{
public:
myitem(myitem *my, QString s,int row,int col);
myitem *parent; // 父節(jié)點
QString sData; // 自身數(shù)據(jù)
QVector<myitem*> childNodes; // 子節(jié)點
int nRow;
int nCol;
};
五 ,小結(jié)
總的來說,我沒有去看源碼來分析這些需要重寫的函數(shù),這樣的效率就比較慢,算是我一點點嘗試出來的結(jié)果。然后進行理解。網(wǎng)上看了下QT帶源碼調(diào)試也比較容易,只要安裝的時候安裝source,然后配置中為源碼打鉤,調(diào)試的時候就可以帶QT源碼調(diào)試了。