• 8092阅读
  • 5回复

如何遍历某节点下面所有选中的节点 [复制链接]

上一主题 下一主题
离线青原落枫
 

只看楼主 倒序阅读 楼主  发表于: 2012-09-12
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2012-09-14) —
如何遍历某节点下面所有选中的节点,并把从该父节点到其子节点的text连成一个字符串

例如这张图我应该返回的字符串分别是:
清华园1栋1单元101室,清华园1栋2单元,清华园2栋这三个字符串,请教诸位朋友指点一下,谢谢啊
离线scphb13

只看该作者 1楼 发表于: 2012-09-13
获取父节点,就好了。
SmallBin
离线XChinux

只看该作者 2楼 发表于: 2012-09-14
// 最终的结果在mapText参数里
void fetchChild(QAbstractItemModel *_model,
        QModelIndex &parentIndex,
        QStringList &stackText,
        QMap<QModelIndex, QString> &mapText)
{
    stackText.push_back(parentIndex.data().toString());
    if (_model->hasChildren(parentIndex))
    {
        for (int i = _model->rowCount(parentIndex) - 1; i > -1; i--)
        {
            QModelIndex idx = _model->index(i, 0, parentIndex);
            fetchChild(_model, idx, stackText, mapText);
        }
    }
    else
    {
        if (parentIndex != QModelIndex())
        {
              mapText[parentIndex] = stackText.join();
        }
    }
    stackText.pop_back();
}

fetchChild(_model, QModelIndex(), stackText, mapText);
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线sbtree
只看该作者 3楼 发表于: 2012-09-14
总版的代码没有考虑节点是否被选中的状态,如果考虑了这一点,并且使用递归,要注意针对半选中节点下的重复问题,例如在楼主的节点“1单元”下再加一个未选中的“301室”
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 4楼 发表于: 2012-09-14
这里利用QStandardItem给出一个完整实现,基本思想是
1 找出所有选中的叶子节点
2 针对找到的叶子节点生成字符串
上面的两个过程都使用了递归的方法
  1. QString parentHierarchicalText(QStandardItem *itself)
  2. {
  3.     QStandardItem *parent = itself->parent();
  4.     if(parent) return QString("%1%2").arg(parentHierarchicalText(parent)).arg(itself->text());
  5.     else return itself->text();
  6. }
  7. void getAllSelectedLeave(QStandardItem *item, QList<QStandardItem *> &leave)
  8. {
  9.     if(item->checkState() != Qt::Unchecked)
  10.     {
  11.         if(item->hasChildren())
  12.         {
  13.             for(int i=0; i<item->rowCount(); ++i)
  14.             {
  15.                 QStandardItem *child = item->child(i,0);
  16.                 getAllSelectedLeave(child,leave);
  17.             }
  18.         }
  19.         else if(item->checkState() == Qt::Checked) leave<<item;
  20.     }
  21. }
  22. void main_c()
  23. {
  24.     QList<QStandardItem *> leave;
  25.     getAllSelectedLeave(root, leave);
  26.     QStringList results;
  27.     foreach(QStandardItem *item, leave) results << parentHierarchicalText(item);
  28. }


代码粗糙,还请多多指教



windows 7 + VC++2008 + Qt4.5.2
离线XChinux

只看该作者 5楼 发表于: 2012-09-14
引用第3楼sbtree于2012-09-14 16:16发表的  :
总版的代码没有考虑节点是否被选中的状态,如果考虑了这一点,并且使用递归,要注意针对半选中节点下的重复问题,例如在楼主的节点“1单元”下再加一个未选中的“301室”


代码未验证,VIM写的,主要表现逻辑。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个