C++

26.自定义ItemModel中的数据结构--Apple的学习笔

2021-08-20  本文已影响0人  applecai

一,前言

上一篇25.自定义ItemModel到QTreeview--Apple的学习笔记我仅修改了treeitem,treemodel模块没有修改,所以treemodel中的回调函数到此是什么策略,还是不清楚,所以本次进行深度练习。

二,需求

自建数据,通过抽象模块绑定到treeview显示,目的是弄明白这些回调函数的运行机制。

三,遇到的问题

  1. 固定的二维数组的数据无法正常显示到treeview
    答:仅能显示第一层级的重复数据。原因是treeview model必须是链表形式的。若数据是固定二维数组直接在model无法找parent和child,若必须要用,则要将其封装为链表形式,并且可以找到child和parent的形式。当然若用tableview显示则不需要parent和child了。

  2. parent和index含义
    答:index是创建子类的,parent创建父节点的,每个子节点又可以作为其他的父节点。若为空说明是主节点。很简单的操作方法就是将parent强制设置为默认值回复,即所有index的父节点只有一个主节点了。显示结果就是全部挂在父节点上一行行的显示了。

  3. data和column及row的含义
    答:data是显示的最终数据,一般可以原始数据显示或加些算法再显示,column和row就是返回当前出入节点总共有几行和几列。

四,效果

image.png

a. 创建数据内容

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源码调试了。

上一篇下一篇

猜你喜欢

热点阅读