使用QFileSystemModel将两个视图与不同的元素同步

时间:2016-12-18 15:23:05

标签: qt qt5 qfilesystemmodel

我使用左侧的QTreeView和右侧/主侧的图标视图使用QListView构建一个类似于目录树/导航窗格的浏览器。树端应该只显示目录(最好是非空目录......但这是一个不同的故事)和图标视图只有具有特定名称过滤器和没有目录的文件。我正在努力如何正确地做到这一点。

首先:我不知道我是否应该使用一两个QFileSystemModels。使用一个我可以为每个视图过滤两个附加的QSortFilterProxyModels - 但我不再拥有文件系统属性....并且仅使用RegEx就是一种限制。并且已经证明使用两个模型很难,因为我无法将QModelIndex从一个模型映射到另一个模型,因为模型包含的项目不同。例如,当我单击左侧的目录时,右侧的根路径应该更新。但该目录未包含在模型中......所以这不起作用。

关于如何做到这一点的任何想法?谢谢!

1 个答案:

答案 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 );
}