QT:使用QDtring搜索QTreeView / QFileSystemModel以获取QModelIndex索引

时间:2015-08-07 02:58:49

标签: c++ qt user-interface search

我正在使用自定义QDialog,以便用户选择文件系统上的目录。我在QFIleSystemModel内使用QTreeView。每当用户选择QTreeView中的项目时,该目录都会写入QLineEdit。我的问题是我希望通过采用类型化文本扩展QTreeView节点来做相反的事情......好吧......如果输入的文本是现有的绝对路径,显然会扩展节点

Just a look at the QDialog

我已经搜索了我的问题的很多变化(虽然我知道它非常负载)并查看了很多类的文档,但我找不到任何内容真的帮助我。我猜测我需要使用QTreeView::expand(const QModelIndex)来扩展它们,但搜索索引是我目前最大的问题。我打开任何建议,真的很感激任何帮助。谢谢你先进,并抱歉制作这样的文字墙。

2 个答案:

答案 0 :(得分:1)

  

搜索索引是我目前最大的问题

索引只是一个"指针"到模型中的项目。你无法搜索"通过"它,因为没有什么"在"一个索引。它只是指向一个项目的指针。

您应该搜索模型index(const QString & path)方法适合您。给定一个路径,它会在路径末尾的元素中返回一个索引。然后,您可以向上迭代以扩展项目:

// ...because QModelIndex::operator= doesn't exist
QModelIndex & assign(QModelIndex & dst, const QModelIndex & src) {
  dst.~QModelIndex();
  new (&dst) QModelIndex(src);
  return dst;
}

void extend(const QString & path, QTreeView * view) {
  auto fs = qobject_cast<QFileSystemModel*>(view->model());
  if (!fs) return;
  auto idx = fs->index(path);
  // ascend up from the child item and expand items in the tree
  while (idx.isValid()) {
    view->expand(idx);
    assign(idx, idx.parent());
  }
}

您也可以将此方法与从路径中删除的最后一项一起使用,因为 - 可能 - 最后一项可能无效,因此fs->index可能会失败。

答案 1 :(得分:-1)

你在这里查看吗?

[模型/视图编程] [在QTreeView中插入和删除行]

http://doc.qt.io/qt-4.8/model-view-programming.html QTreeView & QAbstractItemModel & insertRow

作为基本设计原则,View仅渲染数据。您不应期望通过View直接修改数据。