3

我的应用程序正在使用 QDirIterator 遍历文件夹中的 .jpg 图像。它们被命名为page0、page1、page2 ... page10、page 11 ...等等。

问题是它正在以 page0、page1、page10、page11 等顺序搜索文件。我怎样才能改变这个?是否有正确排序文件的选项?

这是我的代码的一小部分:

QDirIterator it(directory, QDirIterator::Subdirectories);        
while (it.hasNext()) {

        qDebug() << it.filePath();


        if (it.filePath().contains(".jpg"))
        {
            string ImagePath = it.filePath().toStdString();

            Mat img= cv::imread(ImagePath,3);

            vectorMatchQuality.push_back(BestMatch(img, templ));

            vectPath.push_back(ImagePath);

        }

        it.next();
}

我是 C++ 和 Qt 的新手。任何帮助,提示或答案表示赞赏:)

4

2 回答 2

8

QDirIterator 类参考

不像QDir::entryList(),QDirIterator不支持排序。

您不能更改 QDirIterator 中元素的顺序。但QDir::entryList()也无济于事,因为它仅支持一组特定的 sort oders

重命名文件要好得多。这样想:

图片0
图片1
图片2
图3
   ...
图 9
图片10

通常的字符串排序算法在两个字符串之间进行词法比较,其工作方式类似于

  1. 取下一个符号
  2. 如果没有下一个符号转到 5
  3. 如果符号不同,那么
    • 如果第一个符号小于第二个返回 FIRST_LESS
    • 否则返回 FIRST_MORE
  4. 如果它们没有区别转到 1
  5. 如果第一个字符串仍然有符号返回 FIRST_MORE
  6. 如果第二个字符串仍然有符号返回 FIRST_LESS
  7. 返回相同

这就是为什么您将首先获得所有以零开头的文件,然后是所有以 1 开头的文件,依此类推:

图片0
图片1
图片10;因为 1 < 2
图片11;因为 1 < 2
图片12;因为 1 < 2
 ...
图片2
图片20;因为 2 < 3
图片21;因为 2 < 3
图片22;因为 2 < 3
 ...

解决此问题的最简单方法是更改​​文件名。否则,您必须编写自己的文件名解析器,它获取文件名,将其拆分为名称 + 编号并根据编号进行排序。

于 2012-11-11T14:12:39.463 回答
8

我知道这是一个老问题,但 Qt 5.13 的更新答案可能是将QDir::SortFlag与您的QDir对象一起使用

示例用法是:

QDir dir(pathToDirectory);
dir.setSorting(QDir::SortFlag::DirsFirst | QDir::SortFlag::Name);

这首先对目录进行排序,然后按名称对所有目录/文件进行排序;

希望能帮助到你。

于 2019-09-05T13:35:47.650 回答