魏长占

学过好多语言,用过好多框架,不是学得最深的,绝对是学得相对广的。编程是用来解决问题的, 不是用来炫耀技巧的,只学会某一种语言更多的时候,是根本解决不了或者很低效的解决项目面临的一些问题。...

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);
}


阅读更多
个人分类: QT
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭