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