我正在使用自定义QDialog
,以便用户选择文件系统上的目录。我在QFIleSystemModel
内使用QTreeView
。每当用户选择QTreeView
中的项目时,该目录都会写入QLineEdit
。我的问题是我希望通过采用类型化文本扩展QTreeView
节点来做相反的事情......好吧......如果输入的文本是现有的绝对路径,显然会扩展节点
我已经搜索了我的问题的很多变化(虽然我知道它非常负载)并查看了很多类的文档,但我找不到任何内容真的帮助我。我猜测我需要使用QTreeView::expand(const QModelIndex)
来扩展它们,但搜索索引是我目前最大的问题。我打开任何建议,真的很感激任何帮助。谢谢你先进,并抱歉制作这样的文字墙。
答案 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直接修改数据。