簡體   English   中英

排序 QListWidget 項目 (c++)

[英]Sorting QListWidget Items (c++)

我有一個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

有沒有其他方法可以做到這一點?

由於字符串"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

解決此問題的正確方法是在項目上定義自定義訂單

創建一個繼承QListWidgetItem的類MyListWidgetItem並使用該類而不是基類來填充您的列表。 然后重載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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM