通过QTreeWidget节点迭代

Wil*_*aft 2 c++ qt qtreewidget

正如我在过去几个月中多次发布的那样,我正在Qt写一篇期刊/日记应用程序.条目按年,月,日和条目(按天分类条目的默认配置)或年,月和条目(同一月份的所有条目分组在一起)在QTreeWidget中排序

入口节点有两列:第一列是可见的并保存条目名称.第二列是不可见的,并保存数据库中相应条目的行号.选择该条目后,程序将根据该行号执行选择查询并显示内容.Root,year,month,(和day,如果已启用)节点也有第二列,但其中的行号始终为-1.(有效行数从0开始)

日志工具栏已具有后退和前进按钮,用户可以查看下一个和上一个条目.虽然此功能已经有效,但树中当前选定的项目不会随之改变,而这正是我想要解决的问题.

我已经确定最好的方法是使用循环函数扫描每个的第二个隐藏列值,直到找到正确的行号.每次单击后退/前进按钮都会再次调用此功能,因此一旦我开始工作,所选节点将始终与正在查看的当前条目匹配.

缺点是如果数据库变得庞大,这种方法可能会很慢,但我无能为力.用户可能会删除条目或将其随机播放,因此仅依靠rownumber ++或rownumber--可能会导致问题.由于数据库没有填写缺失的行号但只是继续下一行,如果程序总是假定数据库中的每一行在任何给定时间仍然存在,则可能会出现问题.

我的问题是如何扫描QTreeWidget中每个节点的特定列?

Dan*_*ité 13

迭代所有项目可以通过以下方式完成:

QTreeWidgetItemIterator it(treewidget);
while (*it) {
  if ((*it)->text(column_number)=="searched")
    break;
  ++it;
}
Run Code Online (Sandbox Code Playgroud)

但也许QTreeWiget :: findItems()正是你需要的.

另外看一下QStandardItem :: data(),与隐藏列相比,它是存储每项隐藏数据的更好方法.