Russian Qt Forum
Ноябрь 21, 2019, 12:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: sortChildren в QStandardItem по собственному алгоритму.  (Прочитано 2639 раз)
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« : Ноябрь 22, 2017, 13:30 »

Доброго времени суток.

Когда сортируешь списки, есть замечательная штука qSort, в которую последним аргументом можно передать лямбда-функцию, и сортировка пойдёт по собственному алгоритму.

У меня есть QTreeView, а в ней модель, унаследованная от QStandardItemModel.

Хочу отсортировать детей в одном из айтемов в модели Дерева.

Но, в методе sortChildren жёстко прописывается порядок сортировки QSortOrder, никаких lessThan и lambda не передашь Плачущий. В результате алгоритм сортирует айтемы по алфавиту, а мне надо по величине численных значений. Как это реализовать?

Нашёл, что надо копать вокруг QSortFilterProxyModel, но как сделать сортировку по числовым значениям с помощью этого класса, так и не понял.

Мои неудачные попытки реализовать сортировку:

Код:
segmentItem->sortChildren(0,[=](QModelIndex &s1,QModelIndex &s2){
        int first = CommonFunctions::getEndAddressPart(s1.data().toString()).toInt();
        int second = CommonFunctions::getEndAddressPart(s2.data().toString()).toInt();

        return first < second;

    });
так не работает.


Код:
qSort(segmentItem->child(0),segmentItem->child(segmentItem->rowCount() - 1),[=](SegmentStandardItem *&s1,SegmentStandardItem *&s2){
        int first = CommonFunctions::getEndAddressPart(s1->text()).toInt();
        int second = CommonFunctions::getEndAddressPart(s2->text()).toInt();

        return first < second;
    });
так тоже не работает.

Код:
   segmentItem->sortChildren(0,Qt::AscendingOrder);
так сортирует по алфавиту.


SegmentStandardItem  унаследован от QStandardItem

Спасибо.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2070



Просмотр профиля
« Ответ #1 : Ноябрь 22, 2017, 13:43 »

А метод data(Qt::DisplayRole) возвращает строку или значение в QVariantе?
Свойство sortRole может быть как-либо использовано для сортировки.
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #2 : Ноябрь 22, 2017, 13:49 »

А метод data(Qt::DisplayRole) возвращает строку или значение в QVariantе?
Свойство sortRole может быть как-либо использовано для сортировки.

Я не очень понял о чём идёт речь.
У меня метод data вызывается только в qmodelindex, но там всё равно ничего не будет работать. Ибо нет возможности добавить lessThan
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #3 : Ноябрь 22, 2017, 13:59 »

setsortrole тоже не вариант . Этот метод ставится для всей модели, а мне нужно только для айтемов второго уровня
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2070



Просмотр профиля
« Ответ #4 : Ноябрь 22, 2017, 14:26 »

Редко работал с QStandardItemModel
Забыл, как она работает.
Она принимает текстовые значения, значит и возвращает их же, скорее всего.

Перейти на QAbstractItemModel не вариант?
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #5 : Ноябрь 22, 2017, 14:46 »

Редко работал с QStandardItemModel
Забыл, как она работает.
Она принимает текстовые значения, значит и возвращает их же, скорее всего.

Перейти на QAbstractItemModel не вариант?f


Там сортировка по-другому реализована?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2888


Просмотр профиля
« Ответ #6 : Ноябрь 22, 2017, 15:44 »

Там сортировка пишется руками:)
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #7 : Ноябрь 22, 2017, 16:20 »

Там сортировка пишется руками:)

И что, самому пилить быструю сортировку? Неужели нет шаблона никакого?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2888


Просмотр профиля
« Ответ #8 : Ноябрь 22, 2017, 17:22 »

Норкоман, штолле?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2070



Просмотр профиля
« Ответ #9 : Ноябрь 22, 2017, 17:35 »

Там сортировка пишется руками:)

И что, самому пилить быструю сортировку? Неужели нет шаблона никакого?
Можно воспользоваться qSort, например, внутри метода Улыбающийся
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #10 : Ноябрь 22, 2017, 18:14 »

Там сортировка пишется руками:)

И что, самому пилить быструю сортировку? Неужели нет шаблона никакого?
Можно воспользоваться qSort, например, внутри метода Улыбающийся


Это как? В childrensort я могу подать только номер столбца и sortorder.
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #11 : Ноябрь 22, 2017, 18:33 »

Понял, о чём идёт речь. А нужен ли обязательно абстрактный класс. Нельзя что ли в QStandardItem реализовать ещё одну функцию сортировки потомков? И как я воспользуюсь qSort? Потомки должны храниться в виде списка? qSort сортирует списки.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2070



Просмотр профиля
« Ответ #12 : Ноябрь 23, 2017, 10:10 »

Можно попробовать немного повелосипедить.
Есть метод QStandardItem::takeRow, который позволит забрать из модели сортируемые строки и сформировать список этих строк в памяти. Далее этот список отсортировать как требуется и вернуть строки прежнему родителю.
Думаю, должно получиться
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #13 : Ноябрь 23, 2017, 11:25 »

Можно попробовать немного повелосипедить.
Есть метод QStandardItem::takeRow, который позволит забрать из модели сортируемые строки и сформировать список этих строк в памяти. Далее этот список отсортировать как требуется и вернуть строки прежнему родителю.
Думаю, должно получиться

Значит, я формирую список строк. После формирования и сортировки списка мне нужно очистить модель и опять в цикле сделать insertRow()? Дочерние айтемы надеюсь потащутся вместе с родителями?
Записан
Павелъ
Самовар
**
Offline Offline

Сообщений: 105



Просмотр профиля
« Ответ #14 : Ноябрь 23, 2017, 13:43 »

Можно попробовать немного повелосипедить.
Есть метод QStandardItem::takeRow, который позволит забрать из модели сортируемые строки и сформировать список этих строк в памяти. Далее этот список отсортировать как требуется и вернуть строки прежнему родителю.
Думаю, должно получиться

Спасибо, работает!

takeRow() убирает ещё строку, так что не пришлось чистить айтем.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 22.