我有一个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
还有其他选择吗?
答案 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();
}
}