[英]QT: Searching through QTreeView/QFileSystemModel with a QDtring for a QModelIndex index
我正在为用户选择一个自定义QDialog
,以选择文件系统上的目录。 我在QFIleSystemModel
使用QTreeView
。 每当用户在QTreeView
选择一个项目时,该目录就会写入QLineEdit
。 我的问题是,我想通过采用键入的文本扩展QTreeView
节点来做相反的排序,如果...显然,如果键入的文本是现有的绝对路径,则可以扩展节点。
我已经搜索了很多我的问题的变体(尽管我知道它的负载非常大),并且浏览了很多有关类的文档,但是找不到任何真正可以帮助我的东西。 我猜我发现后需要使用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.