排序QListWidget项目(C ++)

时间:2020-03-18 08:08:38

标签: c++ qt

我有一个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 个答案:

答案 0 :(得分:1)

由于字符串 "item 10"字符串 "item 1"长,但是得到的字符为"item 10"[5] < "item 2"[5],因此得到的结果"item 10" < "item 2"甚至更长。有字符比较-没有数字。

因此,您可以创建自己的compare,在其中必须将项目名称用空格分开,然后将字符串转换为数字,然后比较每个部分。

或者,您可以使用formatting创建商品名称。例如,通过在数字QString("item %1").arg(i,3)之前添加一些空格,您得到:

item 11
item 10
item  2
item  1

答案 1 :(得分:1)

解决此问题的正确方法是在商品上定义自定义订单

创建一个继承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();
    }
}