ВЖ
Владимир ЖитковскийШілде 29, 2020, 6:30 Т.Ж.

Сортировка файлов и папок в 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;
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Evgenii Legotckoi
  • Шілде 29, 2020, 6:59 Т.Ж.
  • (өңделген)

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

    ВЖ
    • Шілде 29, 2020, 7:53 Т.Ж.

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

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

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

      Evgenii Legotckoi
      • Шілде 29, 2020, 8:06 Т.Ж.
      • (өңделген)

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

      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;
      }
      
        ВЖ
        • Шілде 29, 2020, 8:55 Т.Ж.

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

        else if (isLeftDir)
            {
                return true;
            }
        
          Evgenii Legotckoi
          • Шілде 29, 2020, 9:05 Т.Ж.

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

            ВЖ
            • Шілде 29, 2020, 9:09 Т.Ж.

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

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз
              Г

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:66ұпай,
              • Бағалау ұпайлары-1
              t

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:33ұпай,
              • Бағалау ұпайлары-10
              t

              Qt - Тест 001. Сигналы и слоты

              • Нәтиже:52ұпай,
              • Бағалау ұпайлары-4
              Соңғы пікірлер
              G
              GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
              Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssrАқп. 8, 2024, 6:43 Т.Қ.
              Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
              Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Енді форумда талқылаңыз
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              F
              FynjyШілде 22, 2024, 4:15 Т.Ж.
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
              BlinCT
              BlinCTМаусым 25, 2024, 1 Т.Ж.
              Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
              BlinCT
              BlinCTМамыр 5, 2024, 5:46 Т.Ж.
              Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
              Evgenii Legotckoi
              Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

              Бізді әлеуметтік желілерде бақылаңыз