QT获取QTreeView当前展开深度,以及逐级展开与收缩功能

1.获取QTreeView当前展开的深度

1.1首先我们要先了解QMoedl中QModelIndex的存在方式

已下方树为例

node0
node1
  node1-0
  node1-1
node2
  node2-0
  node2-1
    node2-1-0
    node2-1-1
  node2-2

这些node的QModelIndex的row与column为下:
因为例子中列只有1列,所以column都为0

node0			//row=0,column=0
node1			//1,0
  node1-0		//  0,0
  node1-1		//  1,0
node2			//2,0
  node2-0		//  0,0
  node2-1		//  1,0
    node2-1-0	//    0,0
    node2-1-1	//    1,0
  node2-2		//2,0

1.2核心接口

本文的核心接口是 QTreeView::isExpanded(const QModelIndex &index)QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex())
index获取节点;isExpanded确认该节点是否被展开

1.3代码

int MyTreeView::getIndexChildsDepth(QAbstractItemModel* model, int thisDepth, const QModelIndex &parent) {
  int depth = -1;
  int childRow = 0;
  while (true) {
  	//依次获取所有子节点,如果子节点无效,说明已经查找完所有子节点,可以跳出循环
    auto index = model->index(childRow++, 0, parent);
    if(!index.isValid())
      break;

    if(isExpanded(index) && model->index(0, 0, index).isValid()) {
      if(depth == -1) {
        depth = thisDepth;
      }

      //递归查找子节点的展开情况
      int childsDepth = getIndexChildsDepth(model, thisDepth + 1, index);
      if(depth < childsDepth) {
        depth = childsDepth;
      }
    }
  }
  return depth;
}
//获取QTreeView当前展开的深度
int MyTreeView::getExpandedDepth() {
  return getIndexChildsDepth(model(), 0);
}

2.逐级展开与收缩功能

使用QTreeView::expandToDepth(int depth)这个接口,展开至指定深度;
注意调用该接口,不会记录已经展开或收缩的节点

void MyTreeWidget::on_expand_clicked() {
  int expandDepth = m_treeView->getExpandedDepth() + 1;
  m_treeView->expandToDepth(expandDepth);
}

void MyTreeWidget::on_collapse_clicked() {
  int expandDepth = m_treeView->getExpandedDepth() - 1;
  if(expandDepth < 0)
    m_treeView->collapseAll();
  else
    m_treeView->expandToDepth(expandDepth);
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值