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")
相关推荐
熬夜苦读学习9 小时前
Qt-- 系统相关
开发语言·qt
趣味科技9 小时前
记录修复EAGET忆捷移动硬盘损坏
windows·数据分析·硬件工程
我命由我1234511 小时前
Java 开发 - List subList 方法
java·windows·操作系统·list·intellij-idea·idea·intellij idea
吃辣我第一11 小时前
监听SHP目录自动注册SuperMap iServer地图服务(Windows版)
windows·iserver·shapefile
Quz11 小时前
QML Tumbler 基础用法:多滚轮选择与自定义外观
qt
Quz11 小时前
QML SpinBox 动画效果:缩放反馈与数字滚动
qt
程序员老陆11 小时前
FFmpeg6 在 Windows 打开麦克风并录成 PCM:不走 Qt Multimedia,也不碰 WASAPI
windows·ffmpeg·音视频·pcm
chushiyunen12 小时前
神雕武功排名
windows
酩酊仙人12 小时前
Windows Server部署django
windows·django·sqlite
小灰灰搞电子1 天前
Qt 实现魔法导航菜单源码分享
开发语言·qt