Самое разумное представляется делать свою модель наследуясь от
QAbstractItemModel, в которй для каждого каталога верхнего уровня создавать
QFileSystemModel. Как ты и хочешь.
Схема примерно такая: делаем класс для внутреннего использования:
struct FileItemSelector {
QFileSystemModel model;
QPersistentModelIndex originIndex;
};
Указатель на экземпляр этого класса в будем хранить в данных индекса.
Далее, в функциях, типа data/rowCount/etc..., которые принимают
QModelIndex добываем указатель на связанный экземпляр и вызываем соответствующую функцию модели:
int MyFileModel::rowCount(const QModelIndex& index) const {
if (!index.isValid())
return countTopLevelBranches();
const FileItemSelector* is = reinterpret_cast<FileItemSelector*>(index.internalPointer());
assert(is);
return is->model->rowCount(is->originIndex);
}
Так же реализуется и index - там выбор модели происходит по родителю:
Выбрали модель, запросили у неё индекс, создали экземпляр FileItemSelector, создали индекс с указателем на него, запомнили внутреннем кеше.
Кешь можно не чистить вовсе, а можно по таймеру или идлу, только проверяя, что индекс реально не нужен через
persistentIndexList.