QTreeVIew 记忆展开状态, 在数据更新时能保持原样

只能记忆展开状态,滚动状态没支持,因为这个树控件 ,可能不使用了 ,半成品

#ifndef QTREEVIEWNOKBD_H
#define QTREEVIEWNOKBD_H
 
 
#include "Header.h"
 
 
typedef struct _NodeP
{
    int nRowNo;
    std::vector<_NodeP> arChildren;
}NodeExpand;
 
 
class QTreeViewNoKbd : public QTreeView
{
public:
    QTreeViewNoKbd();
    void keyPressEvent(QKeyEvent *event);
    void startRemeberNode();
    void startExpandNode();
 
 
private:
    void recursiveRememberNodeState(NodeExpand& ne, QModelIndex root);
    void recursiveExpandNode(NodeExpand& ne, QModelIndex root);
 
 
    NodeExpand m_nodeExpand;
};
 
 
#endif // QTREEVIEWNOKBD_H
 
 





#include "TreeViewNoKbd.h"


QTreeViewNoKbd::QTreeViewNoKbd()
{
    setUniformRowHeights(true);
}


void QTreeViewNoKbd::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case Qt::Key_Down:
    case Qt::Key_Up:
        break;
    default:
        QTreeView::keyPressEvent(event);
        break;
    }
}


void QTreeViewNoKbd::recursiveRememberNodeState(NodeExpand &ne, QModelIndex root)
{
    int nChild = model()->rowCount(root);


    for (int i = 0; i < nChild; i++)
    {
        QModelIndex index = model()->index(i, 0, root);
        if (this->isExpanded(index))
        {
            NodeExpand n;
            n.nRowNo = i;
            recursiveRememberNodeState(n, index);
            ne.arChildren.push_back(n);
        }
    }
}


void QTreeViewNoKbd::recursiveExpandNode(NodeExpand &ne, QModelIndex root)
{
    QModelIndex index = model()->index(ne.nRowNo, 0, root);
    if (!index.isValid())
    {
        return;
    }


    this->expand(index);
    for (int i = 0; i < ne.arChildren.size(); i++)
    {
        recursiveExpandNode(ne.arChildren[i], index);
    }
}




void QTreeViewNoKbd::startExpandNode()
{
    QModelIndex root = this->rootIndex();
    for (int i = 0; i < m_nodeExpand.arChildren.size(); i++)
    {
        this->recursiveExpandNode(m_nodeExpand.arChildren[i], root);
    }
}


void QTreeViewNoKbd::startRemeberNode()
{
    QModelIndex root = this->rootIndex();
    recursiveRememberNodeState(m_nodeExpand, root);
}


猜你喜欢

转载自blog.csdn.net/u18004660201/article/details/80317983