Сортировка элементов QListWidget (c ++) - PullRequest
0 голосов
/ 18 марта 2020

У меня есть QlistWidget с элементами, как показано ниже,

item 1, item 2, item 3, ... , item 11, item 12, item 13

, и я хочу отсортировать их по По убыванию Порядок

item 13
item 12
item 11
item 10
item 9
item 8
item 7
item 6
item 5
item 4
item 3
item 2 
item 1

, но Qt::DescendingOrder дает мне:

item 9
item 8
item 6
item 5
item 4
item 3
item 2
item 13
item 12
item 11
item 10
item 1

есть ли альтернативы для этого?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Надлежащим способом решения этой проблемы является определение пользовательского заказа для элементов.

Создайте класс MyListWidgetItem, который наследует QListWidgetItem, и используйте этот класс вместо Базовый класс для заполнения вашего списка. Затем перегрузит MyListWidgetItem::operator <. Самый простой способ определить operator< - это проанализировать текст элемента. Лучше всего сохранить номер в закрытом поле (например, int MyListWidgetItem::index) и использовать это поле:

bool MyListWidgetItem::operator <(const QListWidgetItem& other) const
{
   // TODO: make sure that `other` is actually a MyListWidgetItem
   return this->index < static_cast<const MyListWidgetItem&>(other).index;
}

Вы также должны использовать это поле для создания текста элемента по требованию (уменьшить избыточность) :

QVariant MyListWidgetItem::data(int role)
{
    switch (role) {
    case Qt::DisplayRole:
       return QString("Item %1").arg(index);
    default:
       return QVariant();
    }
}
1 голос
/ 18 марта 2020

Вы получаете то, что получили, из-за того, что строка "item 10" длиннее, чем строка "item 1", но символ "item 10"[5] < "item 2"[5], поэтому "item 10" < "item 2" даже больше. Существует сравнение символов, а не чисел.

Итак, вы можете создать свое собственное сравнение , где вам нужно разделить имя элемента на пробелы, затем преобразовать строку в число и затем сравнить каждую часть.

Или вы можете создавать имена элементов с форматированием . Например, добавив пробел перед номером QString("item %1").arg(i,3), вы получите:

item 11
item 10
item  2
item  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...