QFileSystemModel сортировка DirsFirst

Как вы сортируете QFileSystemModel с помощью QDir::DirsFirst, как в QDirModel? QFileSystemModel не имеет метода setSorting.


person Yassir Ennazk    schedule 28.05.2012    source источник


Ответы (2)


Насколько я могу судить, вы не можете (в Qt4).

Порядок сортировки по умолчанию (по столбцу «имя») или сортировка по размеру ведет себя как QDir::DirsFirst (или DirsLast в обратном порядке для ), но сортировка по времени или типу обрабатывает каталоги не иначе, чем обычные файлы.

QFileSystemModel не предоставляет API для изменения порядка сортировки, и я не вижу возможности повлиять на него в коде QFileSystemModel.

(Я не вижу ничего в текущих документах Qt5, указывающих на то, что это изменилось, но они не являются окончательными, и я не очень внимательно смотрел.)

person Mat    schedule 28.05.2012
comment
Спасибо, я закончил сортировку по столбцу размера. - person Yassir Ennazk; 29.05.2012
comment
Каноническим способом сделать это было бы добавить прокси-модель, которая сортирует ее так, как вы хотите. - person Kuba hasn't forgotten Monica; 01.06.2012

Может кому это понадобится. Я реализовал первую сортировку каталогов, используя 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);
}
person x610    schedule 21.12.2013