QT Windows 资源管理器的排序规则

如果你使用QTableView装载数据,那么一定会遇到点击表头进行排序的需求。如果不进行任何自定义排序,那么QT的默认的排序(首字符的编码进行排序)可能并不符合用户的预期。如果我们的排序规则跟Windows资源管理器保持一致,那么用户应该不会再对排序有其他异议了。

以下是使用QT的 QCollator 进行自然排序的示例代码,这个函数可以对字符串列表进行类似Windows资源管理器的自然排序,它能正确处理字符串中的数字部分,比如"file2"会排在"file10"之前。

cpp 复制代码
#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();
}

输出结果:

bash 复制代码
result= ("file1.txt", "file2.txt", "file3.txt", "file10.txt", "File20.TXT", "readme", "文件20.dat", "文件100.dat")
相关推荐
Android小码家11 分钟前
Vscode + docker + qt 网络监听小工具
vscode·qt·docker
yudiandian201438 分钟前
【QT 5.12.12 打包-Windows 平台下】
开发语言·qt
要记得喝水39 分钟前
C#某公司面试题(含题目和解析)--1
开发语言·windows·面试·c#·.net
XXYBMOOO4 小时前
Qt UDP 通信类详解与实现
开发语言·网络·c++·qt·网络协议·ui·udp
小韩博4 小时前
Windows 权限提升(一)
windows
jzzy_hony5 小时前
移植Qt4.8.7到ARM40-A5
qt·ubuntu·arm·终端
魔都吴所谓6 小时前
【Python】根据开始时间、结束时间计算中间时间
开发语言·windows·python
syty20207 小时前
flink 伪代码
java·windows·flink
IDOlaoluo8 小时前
TortoiseGit 2.4.0.0 64位安装教程(附详细步骤和Git配置 附安装包)
windows
知行力8 小时前
【GitHub每日速递】不止 TeamViewer 替代!RustDesk 与 PowerToys,Windows 效率神器
windows·github·teamviewer