我使用左侧的QTreeView
和右侧/主侧的图标视图使用QListView
构建一个类似于目录树/导航窗格的浏览器。树端应该只显示目录(最好是非空目录......但这是一个不同的故事)和图标视图只有具有特定名称过滤器和没有目录的文件。我正在努力如何正确地做到这一点。
首先:我不知道我是否应该使用一两个QFileSystemModels
。使用一个我可以为每个视图过滤两个附加的QSortFilterProxyModels
- 但我不再拥有文件系统属性....并且仅使用RegEx就是一种限制。并且已经证明使用两个模型很难,因为我无法将QModelIndex
从一个模型映射到另一个模型,因为模型包含的项目不同。例如,当我单击左侧的目录时,右侧的根路径应该更新。但该目录未包含在模型中......所以这不起作用。
关于如何做到这一点的任何想法?谢谢!
答案 0 :(得分:1)
文件目录树视图和文件导航视图如何交互?
不坚持这是唯一可行但对我有用的方式:
QSortFilterProxyModel
首先必须从那里获取当前的观看位置void MyFileSystemWidget::startViews()
{
// First, initialize QTreeView and QTableView each with own
// QFileSystemModel/QSortFilterProxyModel(MySortFilterProxyModel)
// with individual selection e.g. QDir::Files or QDir::Dirs
//// //// ////
// Make models to point at the same root to start
const QModelIndex rootTreeViewIdx = m_pTreeSortFilterProxyModel->mapFromSource( m_pTreeDataModel->index(rootDir.path()) );
m_pTreeView->setRootIndex(rootTreeViewIdx);
m_pTreeView->setCurrentIndex(rootTreeViewIdx);
const QModelIndex rootFileViewIdx = m_pListSortFilterProxyModel->mapFromSource( m_pListDataModel->index(rootDir.path()) );
m_pTableView->setRootIndex(rootFileViewIdx);
// now connect tree view clicked signal
connect(m_pTreeView, SIGNAL(clicked(QModelIndex)), SLOT(onTreeViewClicked(QModelIndex)));
}
void MyFileSystemWidget::onTreeViewClicked(const QModelIndex& treeIndex)
{
// see MySortFilterProxyModel::sourceFileInfo
QString modelPath = m_pTreeSortFilterProxyModel->sourceFileInfo( treeIndex ).absoluteFilePath();
if (modelPath.isEmpty())
return;
// see MySortFilterProxyModel::setSourceModelRootPath
const QModelIndex proxyIndex = m_pListSortFilterProxyModel->setSourceModelRootPath(modelPath);
m_pTableView->setRootIndex(proxyIndex);
}
QFileInfo MySortFilterProxyModel::sourceFileInfo(const QModelIndex& index)
{
if (!index.isValid())
return QFileInfo();
const QModelIndex proxyIndex = mapToSource( index );
if (!proxyIndex.isValid())
return QFileInfo();
return static_cast<QFileSystemModel*>(sourceModel())->fileInfo(proxyIndex);
}
QModelIndex MySortFilterProxyModel::setSourceModelRootPath(const QString& modelPath)
{
const QModelIndex fmIndex = static_cast<QFileSystemModel*>(sourceModel())->setRootPath(modelPath);
return mapFromSource( fmIndex );
}