正如我在过去几个月中多次发布的那样,我正在Qt写一本日记/日记应用程序。条目按年,月,日和条目(按天分类条目的默认配置)或年,月和条目(同一月份的所有条目分组在一起)排序在QTreeWidget中。
条目节点有两列:第一列是可见的并保存条目名称。第二列是不可见的,并保存数据库中相应条目的行号。选择该条目后,程序将根据该行号执行选择查询并显示内容。 Root,year,month,(和day,如果已启用)节点也有第二列,但其中的行号始终为-1。 (有效行数从0开始)
日记工具栏已有后退和前进按钮,可让用户查看下一个和上一个条目。虽然此功能已经有效,但树中当前选定的项目不会随之改变,而这正是我想要解决的问题。
我已经确定最好的方法是使用循环函数扫描每个的第二个隐藏列值,直到找到正确的行号。每次单击后退/前进按钮都会再次调用此功能,因此一旦我开始工作,所选节点将始终与正在查看的当前条目匹配。
缺点是如果数据库变得庞大,这种方法可能会很慢,但我无能为力。用户可能会删除条目或将其随机播放,因此仅依靠rownumber ++或rownumber--可能会导致问题。由于数据库没有填写缺失的行号但只是继续下一行,如果程序总是假定数据库中的每一行在任何给定时间仍然存在,则可能会出现问题。
我的问题是如何扫描QTreeWidget中每个节点的特定列?
答案 0 :(得分:13)
迭代所有项目可以通过以下方式完成:
QTreeWidgetItemIterator it(treewidget);
while (*it) {
if ((*it)->text(column_number)=="searched")
break;
++it;
}
但也许QTreeWiget :: findItems()就是你所需要的。
另外看一下QStandardItem :: data(),与隐藏列相比,它是存储每项隐藏数据的更好方法。