一,前言
上一篇25.自定义ItemModel到QTreeview--Apple的学习笔记我仅修改了treeitem,treemodel模块没有修改,所以treemodel中的回调函数到此是什么策略,还是不清楚,所以本次进行深度练习。
二,需求
自建数据,通过抽象模块绑定到treeview显示,目的是弄明白这些回调函数的运行机制。
三,遇到的问题
-
固定的二维数组的数据无法正常显示到treeview
答:仅能显示第一层级的重复数据。原因是treeview model必须是链表形式的。若数据是固定二维数组直接在model无法找parent和child,若必须要用,则要将其封装为链表形式,并且可以找到child和parent的形式。当然若用tableview显示则不需要parent和child了。 -
parent和index含义
答:index是创建子类的,parent创建父节点的,每个子节点又可以作为其他的父节点。若为空说明是主节点。很简单的操作方法就是将parent强制设置为默认值回复,即所有index的父节点只有一个主节点了。显示结果就是全部挂在父节点上一行行的显示了。 -
data和column及row的含义
答:data是显示的最终数据,一般可以原始数据显示或加些算法再显示,column和row就是返回当前出入节点总共有几行和几列。
四,效果
image.pnga. 创建数据内容
mytreemodel::mytreemodel(QObject *parent)
: QAbstractItemModel(parent)
{
// 创建root节点
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. 自建数据结构
class myitem
{
public:
myitem(myitem *my, QString s,int row,int col);
myitem *parent; // 父节点
QString sData; // 自身数据
QVector<myitem*> childNodes; // 子节点
int nRow;
int nCol;
};
五 ,小结
总的来说,我没有去看源码来分析这些需要重写的函数,这样的效率就比较慢,算是我一点点尝试出来的结果。然后进行理解。网上看了下QT带源码调试也比较容易,只要安装的时候安装source,然后配置中为源码打钩,调试的时候就可以带QT源码调试了。
网友评论