QDirIterator迭代顺序

时间:2012-11-11 13:57:27

标签: c++ qt directory iteration

我的应用程序正在使用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的新手。任何帮助,提示或答案都赞赏:)

2 个答案:

答案 0 :(得分:6)

  

QDirIterator Class Reference

     

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

您无法更改QDirIterator中元素的顺序。但是QDir::entryList()也不会帮助你,因为supports only a specific set of sort oders

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

Image0
Image1
Image2
Image3
   ...
Image9
Image10

通常的字符串排序算法会在两个字符串之间进行词法比较,就像

一样
  1. 采取下一个符号
  2. 如果没有下一个符号,请转到5
  3. 如果符号不同则
    • 如果第一个符号小于第二个返回FIRST_LESS
    • 否则返回FIRST_MORE
  4. 如果他们没有差异goto 1
  5. 如果第一个字符串仍有符号,则返回FIRST_MORE
  6. 如果第二个字符串仍有符号,则返回FIRST_LESS
  7. 返回SAME
  8. 这就是为什么你会得到所有文件以零开始,然后所有文件以1开头,依此类推:

    Image0
    Image1
    Image10 ; because 1 < 2
    Image11 ; because 1 < 2
    Image12 ; because 1 < 2
     ...
    Image2
    Image20 ; because 2 < 3
    Image21 ; because 2 < 3
    Image22 ; because 2 < 3
     ...
    

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

答案 1 :(得分:2)

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

示例用法是:

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

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

希望有帮助。