【问题标题】:Iterating through QTreeWidget Nodes遍历 QTreeWidget 节点
【发布时间】:2012-01-07 20:15:46
【问题描述】:

正如我在过去几个月中多次发布的那样,我正在用 Qt 编写日记/日记应用程序。条目在 QTreeWidget 中按年、月、日和条目(按天排序条目的默认配置)或按年、月和条目(来自同一个月的所有条目组合在一起)进行排序

入口节点有两列:第一列是可见的并保存入口名称。第二列是不可见的,它保存数据库中相应条目的行号。选择该条目时,程序会根据该行号选择查询并显示内容。根、年、月(和日,如果启用)节点也有第二列,但其上的行号始终为 -1。 (有效行数从 0 开始)

日志工具栏已经有后退和前进按钮,可让用户查看下一个和上一个条目。虽然这个函数已经工作了,但树中当前选定的项目并没有随之改变,这就是我要修复的问题。

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

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

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

【问题讨论】:

    标签: c++ qt qtreewidget


    【解决方案1】:

    可以通过以下方式遍历所有项目:

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

    但也许 QTreeWiget::findItems() 正是您所需要的。

    另请参阅 QStandardItem::data(),与隐藏列相比,它是存储每个项目隐藏数据的更好方法。

    【讨论】:

    • QTreeWidgetItemIterator it(treeWidget); while (*it) { if ((*it)->text(0) == itemText) (*it)->setSelected(true); ++它; }
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多