ВЖ
29 липня 2020 р. 16:30

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

sort, QSortFilterProxyModel, qt

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

  1. bool SortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
  2. {
  3. bool isDir = QVariant(sourceModel()->data(left, Roles::IsDirRole).toString()).toBool();
  4.  
  5. QString const leftName = sourceModel()->data(left, Roles::NameRole).toString();
  6. QString const rightName = sourceModel()->data(right, Roles::NameRole).toString();
  7.  
  8. if(isDir)
  9. {
  10. return true;
  11. }
  12. else
  13. {
  14. int const compare = QString::localeAwareCompare(leftName, rightName);
  15. if(compare != 0) {
  16. return compare < 0 && isDir;
  17. }
  18. }
  19.  
  20. return false;
  21. }
2

Вам це подобається? Поділіться в соціальних мережах!

6
Evgenii Legotckoi
  • 29 липня 2020 р. 16:59
  • (відредаговано)

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

    ВЖ
    • 29 липня 2020 р. 17:53

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

    1. model: SortFilterProxyModel {
    2. source: FileBrowserModel
    3. sortOrder: Qt.AscendingOrder
    4. sortCaseSensitivity: Qt.CaseInsensitive
    5. }

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

      Evgenii Legotckoi
      • 29 липня 2020 р. 18:06
      • (відредаговано)

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

      1. bool SortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
      2. {
      3. bool isLeftDir = QVariant(sourceModel()->data(left, Roles::IsDirRole).toString()).toBool();
      4. bool isRightDir = QVariant(sourceModel()->data(right, Roles::IsDirRole).toString()).toBool();
      5.  
      6. QString const leftName = sourceModel()->data(left, Roles::NameRole).toString();
      7. QString const rightName = sourceModel()->data(right, Roles::NameRole).toString();
      8.  
      9. if ((isLeftDir && isRightDir) || (!isLeftDir && !isRightDir))
      10. {
      11. const int compare = QString::localeAwareCompare(leftName, rightName);
      12. if(compare != 0) {
      13. return compare < 0;
      14. }
      15. }
      16. else if (isLeftDir)
      17. {
      18. return true;
      19. }
      20.  
      21. return false;
      22. }
        ВЖ
        • 29 липня 2020 р. 18:55

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

        1. else if (isLeftDir)
        2. {
        3. return true;
        4. }

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

            ВЖ
            • 29 липня 2020 р. 19:09

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

              Коментарі

              Only authorized users can post comments.
              Please, Log in or Sign up
              • Останні коментарі
              • Evgenii Legotckoi
                16 квітня 2025 р. 17:08
                Благодарю за отзыв. И вам желаю всяческих успехов!
              • IscanderChe
                12 квітня 2025 р. 17:12
                Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
              • AK
                01 квітня 2025 р. 11:41
                Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
              • Evgenii Legotckoi
                09 березня 2025 р. 21:02
                К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
              • VP
                09 березня 2025 р. 16:14
                Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…