Сортировка файлов и папок в QSortFilterProxyModel

sort, QSortFilterProxyModel, qt

Доброго дня! Есть задача отсортировать данные в директории таким образом, чтобы сначала шли папки в алфавитном порядке, а затем файлы тоже в алфавитном порядке. Данным кодом получается добиться только порядка: сначала папки, потом файлы, но они не по алфавиту идут. Что в этом коде надо поправить, может кто видит..

bool SortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
    bool isDir = QVariant(sourceModel()->data(left, Roles::IsDirRole).toString()).toBool();

    QString const leftName  = sourceModel()->data(left,  Roles::NameRole).toString();
    QString const rightName = sourceModel()->data(right, Roles::NameRole).toString();

    if(isDir)
    {
        return true;
    }
    else
    {
        int const compare = QString::localeAwareCompare(leftName, rightName);
        if(compare != 0) {
            return compare < 0 && isDir;
        }
    }

    return false;
}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

6
Evgenii Legotckoi
  • July 29, 2020, 6:59 a.m.
  • (edited)

Добрый день! А какую исходную модель используете? Случайно не QDirModel ? Просто у неё есть метод setSorting , который при установке некоторых флагов позволит отсортировать как по имени, так и по типу, сначала директории, а потом файлы и наоборот. И использование QSortFilterProxyModel будет избыточна. Просто в Qt для подобного функционала уже всё реализовано.

    Вообще исходной является QAbstractTableModel. Само отображение происходит в QML. Изначально, когда это делалось про сортировку никто видимо не подумал, поэтому потом пришлось навернуть еще QSortFilterProxyModel поверх..
    Отображение в QML:

    model: SortFilterProxyModel {
                        source: FileBrowserModel
                        sortOrder: Qt.AscendingOrder
                        sortCaseSensitivity: Qt.CaseInsensitive                    
                    }
    

    Видимо в методе lessThan() сортировать по типу и имени не получится, это ей несколько проходов сделать надо будет.. либо какое-то хитрое условие прописать как сравнивать..

      Evgenii Legotckoi
      • July 29, 2020, 8:06 a.m.
      • (edited)

      Ну тогда так попробуйте. Там нужно делать сравнение по алфавиту лишь в том случае если и левый и правый индекс либо каталоги, либо файлы. Что по сути не делается в вашем коде.

      bool SortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
      {
          bool isLeftDir = QVariant(sourceModel()->data(left, Roles::IsDirRole).toString()).toBool();
          bool isRightDir = QVariant(sourceModel()->data(right, Roles::IsDirRole).toString()).toBool();
      
          QString const leftName  = sourceModel()->data(left,  Roles::NameRole).toString();
          QString const rightName = sourceModel()->data(right, Roles::NameRole).toString();
      
          if ((isLeftDir && isRightDir) || (!isLeftDir && !isRightDir))
          {
              const int compare = QString::localeAwareCompare(leftName, rightName);
              if(compare != 0) {
                  return compare < 0;
              }
          }
          else if (isLeftDir)
          {
              return true;
          }
      
          return false;
      }
      

        Шикарно! Спасибо, то что надо!
        Первый if понятен, а зачем вот эта часть, что-то не пойму..

        else if (isLeftDir)
            {
                return true;
            }
        

          Вам нужно расположить сначала каталоги, а потом файлы. Так же? Поэтому нужно проверить, что левый индекс является каталогом, а правый в данном случае будет считаться файлом, поскольку первый if уже исключил, что оба индекса могут отвечать за каталоги или файлы одновременнов.

            Ясно, спасибо. Работает как нужно

              Comments

              Only authorized users can post comments.
              Please, Log in or Sign up
              AD

              C ++ - Test 004. Pointers, Arrays and Loops

              • Result:50points,
              • Rating points-4
              m

              C ++ - Test 004. Pointers, Arrays and Loops

              • Result:80points,
              • Rating points4
              m

              C ++ - Test 004. Pointers, Arrays and Loops

              • Result:20points,
              • Rating points-10
              Last comments
              ИМ
              Игорь МаксимовNov. 22, 2024, 11:51 a.m.
              Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
              Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEOct. 19, 2024, 8:19 a.m.
              Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовOct. 5, 2024, 7:51 a.m.
              Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5July 5, 2024, 11:02 a.m.
              QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Now discuss on the forum
              Evgenii Legotckoi
              Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey1Nov. 15, 2024, 6:04 a.m.
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProjectJune 4, 2022, 3:49 a.m.
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
              9
              9AnonimOct. 25, 2024, 9:10 a.m.
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

              Follow us in social networks