Как вы сортируете QFileSystemModel с помощью QDir::DirsFirst, как в QDirModel? QFileSystemModel не имеет метода setSorting
.
QFileSystemModel сортировка DirsFirst
Ответы (2)
Насколько я могу судить, вы не можете (в Qt4).
Порядок сортировки по умолчанию (по столбцу «имя») или сортировка по размеру ведет себя как QDir::DirsFirst
(или DirsLast
в обратном порядке для ), но сортировка по времени или типу обрабатывает каталоги не иначе, чем обычные файлы.
QFileSystemModel
не предоставляет API для изменения порядка сортировки, и я не вижу возможности повлиять на него в коде QFileSystemModel
.
(Я не вижу ничего в текущих документах Qt5, указывающих на то, что это изменилось, но они не являются окончательными, и я не очень внимательно смотрел.)
Может кому это понадобится. Я реализовал первую сортировку каталогов, используя QSortFilterProxyModel для QFileSystemModel, как упоминает Куба Обер в комментарии. Может быть, еще не идеально, но все же правильное направление.
bool MySortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
// If sorting by file names column
if (sortColumn() == 0) {
QFileSystemModel *fsm = qobject_cast<QFileSystemModel*>(sourceModel());
bool asc = sortOrder() == Qt::AscendingOrder ? true : false;
QFileInfo leftFileInfo = fsm->fileInfo(left);
QFileInfo rightFileInfo = fsm->fileInfo(right);
// If DotAndDot move in the beginning
if (sourceModel()->data(left).toString() == "..")
return asc;
if (sourceModel()->data(right).toString() == "..")
return !asc;
// Move dirs upper
if (!leftFileInfo.isDir() && rightFileInfo.isDir()) {
return !asc;
}
if (leftFileInfo.isDir() && !rightFileInfo.isDir()) {
return asc;
}
}
return QSortFilterProxyModel::lessThan(left, right);
}