繁体   English   中英

QT:使用QDtring在QTreeView / QFileSystemModel中搜索QModelIndex索引

[英]QT: Searching through QTreeView/QFileSystemModel with a QDtring for a QModelIndex index

我正在为用户选择一个自定义QDialog ,以选择文件系统上的目录。 我在QFIleSystemModel使用QTreeView 每当用户在QTreeView选择一个项目时,该目录就会写入QLineEdit 我的问题是,我想通过采用键入的文本扩展QTreeView节点来做相反的排序,如果...显然,如果键入的文本是现有的绝对路径,则可以扩展节点。

看看QDialog

我已经搜索了很多我的问题的变体(尽管我知道它的负载非常大),并且浏览了很多有关类的文档,但是找不到任何真正可以帮助我的东西。 我猜我发现后需要使用QTreeView::expand(const QModelIndex)来扩展它们,但是QTreeView::expand(const QModelIndex)搜索索引是我最大的问题。 我愿意征求任何建议,我们将不胜感激。 在此先感谢您,并很抱歉在此文字墙。

到目前为止,搜索索引是我最大的问题

索引只是模型中项目的“指针”。 您无法通过它进行搜索,因为索引中没有任何内容。 它只是指向一个项目的指针。

您应该搜索模型 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可能会失败。

你在这里检查吗?

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

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

作为基本设计原则,View仅呈现数据。不要期望直接通过View修改数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM