如何按照一定的顺序(不是字母顺序)对QList进行排序?

tra*_*gan 0 sorting qt qsort qlist

我有QList<m_User>

m_User {
    QString status;
    QString firstName;
    QString lastName;
    QDate joinDate;
    QDate leaveDate;
}
Run Code Online (Sandbox Code Playgroud)

status这里可以是:terminated, in test, requested, activated

排序顺序status应该是:activated-> terminated-> requested->in test

该 QList 应按照以下顺序排序:

  1. 状态(顺序如上)
  2. 如果状态相同,我们对名字排序,这次按字母顺序
  3. 如果名字相同,我们也按字母顺序对姓氏进行排序

所以结果应该是这样的

----------------------------------------------------------
| firstName | lastName |  status  | joinDate | leaveDate |
----------------------------------------------------------
|     A     |    C     |activated |   bla    |    bla    |
|     A     |    D     |activated |   bla    |    bla    | 
|     B     |    E     |activated |   bla    |    bla    |

|     A     |    F     |terminated|   bla    |    bla    | 
|     A     |    G     |terminated|   bla    |    bla    | 
|     B     |    H     |terminated|   bla    |    bla    |

|     A     |    I     |requested |   bla    |    bla    | 
|     B     |    I     |requested |   bla    |    bla    | 
|     B     |    K     |requested |   bla    |    bla    |

|     A     |    L     | in test  |   bla    |    bla    |  
|     B     |    L     | in test  |   bla    |    bla    |
|     B     |    M     | in test  |   bla    |    bla    |
Run Code Online (Sandbox Code Playgroud)

Xpl*_*rms 5

您可以将 lessThen 函数添加到您的类/结构中,然后根据需要为 qSort 创建转发器。例子:

class m_User {
public:
bool operator<(const m_User other) const {
        return a<other.a;
    }
};

template <typename T>
struct ForwardLessThen
{     
  bool operator()(const T* a, const T* b) const     
  {
    return *a < *b;
  } 
}; 

qSort(list.begin(), list.end(), ForwardLessThen<m_User>());
Run Code Online (Sandbox Code Playgroud)

如果您使用 C++11/14,则可以使用 lambda

QList<const m_User*> l;
qSort(l.begin(), l.end(), 
      [](const m_User* a, const m_User* b) -> bool { return a->firstName() < b->firstName(); //implement your logic here
}); 
Run Code Online (Sandbox Code Playgroud)

对于 Qt5,qSort 实际上已被弃用,您应该使用 std::sort 函数。

std::sort(container.begin(), container.end(), qLess<T>());
Run Code Online (Sandbox Code Playgroud)

查看QtAlgorithms中基于模板的算法

编辑:或者如果您计划使用某种视图模型(如 ListView),您甚至可以实现自己的QSortFilterProxyModel