使用Qt自然地对文件名进行排序

Her*_*rst 24 c++ qt natural-sort

我正在阅读目录内容使用QDir::entryList().其中的文件名结构如下:

index_randomNumber.png
Run Code Online (Sandbox Code Playgroud)

我需要按照indexWindows资源管理器对文件进行排序的方式排序,以便我得到

0_0815.png
1_4711.png
2_2063.png
...
Run Code Online (Sandbox Code Playgroud)

而不是排序通过QDir::Name给我:

0_0815.png
10000_6661.png
10001_7401.png
...
Run Code Online (Sandbox Code Playgroud)

在Qt中是否有内置的方法来实现这一点,如果没有,那么实现它的正确位置是什么?

Rom*_*rio 15

如果要使用QCollator从返回的条目列表中对条目QDir::entryList进行排序,可以使用以下结果对结果进行排序std::sort():

dir.setFilter(QDir::Files | QDir::NoSymLinks);
dir.setSorting(QDir::NoSort);  // will sort manually with std::sort

auto entryList = dir.entryList();

QCollator collator;
collator.setNumericMode(true);

std::sort(
    entryList.begin(),
    entryList.end(),
    [&collator](const QString &file1, const QString &file2)
    {
        return collator.compare(file1, file2) < 0;
    });
Run Code Online (Sandbox Code Playgroud)

根据The Badger的评论,QCollator也可以直接用作参数std::sort,替换lambda,所以最后一行变为:

std::sort(entryList.begin(), entryList.end(), collator);
Run Code Online (Sandbox Code Playgroud)

  • 实际上不需要lambda,因为QCollat​​or有一个未记录的`operator()`:`std :: sort(entryList.begin(),entryList.end(),collat​​or);`应该足够好了.我认为它在文档中的以下行中暗示"QCollat​​or对象可以与基于模板的排序算法一起使用,例如std :: sort来排序QStrings列表." (4认同)

sca*_*cai 13

Qt在Qt 5.2之前没有自然排序实现,请参阅此功能请求.

从Qt 5.2开始,QCollat​​or允许在启用数字模式时进行自然排序 .