QT Windows 资源管理器的排序规则
如果你使用QTableView装载数据,那么一定会遇到点击表头进行排序的需求。如果不进行任何自定义排序,那么QT的默认的排序(首字符的编码进行排序)可能并不符合用户的预期。如果我们的排序规则跟Windows资源管理器保持一致,那么用户应该不会再对排序有其他异议了。
以下是使用QT的 QCollator 进行自然排序的示例代码,这个函数可以对字符串列表进行类似Windows资源管理器的自然排序,它能正确处理字符串中的数字部分,比如"file2"会排在"file10"之前。
#include <QCoreApplication>
#include <QRegularExpression>
#include <QCollator>
#include <QDebug>QStringList sortStringListNatural(const QStringList &strList, bool bAscending)
{// 创建排序器,使用当前系统区域设置QCollator qCollator;qCollator.setNumericMode(true); // 启用数字模式,将数字作为数值而非字符串比较qCollator.setCaseSensitivity(Qt::CaseInsensitive); // 不区分大小写// 创建结果列表的副本QStringList strResult = strList;// 使用Lambda表达式进行排序比较if (bAscending) {// 升序排序std::sort(strResult.begin(), strResult.end(),[&qCollator](const QString &str1, const QString &str2) {return qCollator.compare(str1, str2) < 0;});} else {// 降序排序std::sort(strResult.begin(), strResult.end(),[&qCollator](const QString &str1, const QString &str2) {return qCollator.compare(str1, str2) > 0;});}return strResult;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QStringList names = {"file1.txt","file10.txt","file2.txt","File20.TXT","file3.txt","readme","文件100.dat","文件20.dat"};QStringList result = sortStringListNatural(names, true);qDebug() << "result=" << result;return a.exec();
}
输出结果:
result= ("file1.txt", "file2.txt", "file3.txt", "file10.txt", "File20.TXT", "readme", "文件20.dat", "文件100.dat")