QT -- QCollat​​or对QStringList进行排序

发布时间 2024-01-05 11:16:41作者: 手磨咖啡

1.QCollator

QCollator是一个可以适用于特定语言环境的字符串排序工具。QCollator对象还可以与std::sort模板函数一起使用来排序QString列表。

QCollator collator;
//区分大小写
collator.setCaseSensitivity(Qt::CaseSensitivity::CaseSensitive);
//不忽略标点符号
collator.setIgnorePunctuation(false);
//排序适用的区域
collator.setLocale(QLocale(QLocale::Chinese));
//使用数字排序
collator.setNumericMode(true);
 
collator(leftName, rightName);

例一:

std::vector<QString> result;
 
result.emplace_back("A1");
result.emplace_back("KL10");
result.emplace_back("KL1");
result.emplace_back("KL2");
result.emplace_back("KA1");
result.emplace_back("BL1");
result.emplace_back("X1");
result.emplace_back("Q1");
result.emplace_back("a1");
 
std::sort(result.begin(), result.end(), [](const QString& left, const QString& right) {
    QCollator collator;
    collator.setCaseSensitivity(Qt::CaseSensitivity::CaseSensitive); //区分大小写
    collator.setIgnorePunctuation(false);                            //不忽略标点符号
    collator.setLocale(QLocale(QLocale::Chinese));
    collator.setNumericMode(true);                                  // 启用数字排序模式
return collator(left, right); });

排序结果:

a1
A1
BL1
KA1
KL1
KL2
KL10
Q1
X1

 

QCollator类根据排序规则算法比较字符串。以下例子是对QStringList进行数字优先且区分大小写比较排序。

例二:

#include <QStringList>
#include <QCollator>
#include <QDebug>

int main( int argc, char *argv[] ) {

   QStringList myStringList = (QStringList() << "abc123" << "ABc99" << "1234abcd");
   QCollator sorter;
   sorter.setNumericMode(true); // 启用数字排序模式
   sorter.setCaseSensitivity(Qt::CaseInsensitive); // 设置区分大小写模式
   std::sort(myStringList.begin(), 
             myStringList.end(), 
             [&](const QString& a, const QString& b) 
             {
                 return sorter.compare( a, b ) < 0;
             });
   qDebug() << myStringList;
}

 上面的代码应输出以下内容:

("1234abcd", "ABc99", "abc123")

 

例三: