2016-12-18 9 views
0

Я создаю такой же просмотр с деревом каталогов/панелью навигации с помощью QTreeView с левой стороны и с изображением справа на правой стороне с помощью QListView. Сторона дерева должна показывать только каталоги (предпочтительные непустые каталоги ... но это совсем другая история), а значок - только файлы с определенным фильтром имен и без каталогов. И я изо всех сил пытаюсь сделать это правильно.Использование QFileSystemModel для синхронизации двух видов с различными элементами

Во-первых: Я не знаю, должен ли я использовать один или два QFileSystemModels для этого. Используя один, я должен фильтровать с двумя прикрепленными QSortFilterProxyModels для каждого представления, но у меня больше нет свойств файловой системы .... и использование только RegEx для этого является своего рода ограничивающим. И использование двух моделей было доказано, что я не могу на самом деле сопоставить QModelIndex от одной модели в другой, потому что модели содержат не те же элементы. Например, когда я нажимаю на каталог слева, корневой путь справа должен обновляться. Но каталог не включен в модель ... так что это не работает.

Любые идеи о том, как это сделать правильно? Спасибо!

ответ

1

Как можно взаимодействовать с деревом каталогов файлов и видом навигации по файлу?

Не настаивая на том, что это единственный способ, но работает для меня:

  • Один вид модели фильтров только каталоги и другие файлы только
  • Каждый вид (дерево каталогов и файлов навигации) использует отдельный объект модели объекта того же типа, указывающий на некоторый корень
  • Синхронизация представлений с использованием пути в файловой системе: при изменении любого из вариантов (в вашем случае t вид РЗЭ) пользователем нажмите другой подбирая из того же пути
  • ум, что с 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); 
}