QDirIterator迭代顺序

Ole*_*røm 2 c++ directory iteration qt

我的应用程序使用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();
}
Run Code Online (Sandbox Code Playgroud)

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

Zet*_*eta 7

QDirIterator类参考

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

您无法更改QDirIterator中元素的顺序.但是QDir::entryList()也不会帮助你,因为它只支持一组特定的排序oders.

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

Image0
Image1
Image2
Image3
   ...
Image9
Image10

通常的字符串排序算法会在两个字符串之间进行词法比较,其效果类似

  1. 拿下一个符号
  2. 如果没有下一个符号,请转到5
  3. 如果符号不同那么
    • 如果第一个符号小于第二个符号FIRST_LESS
    • 否则返回FIRST_MORE
  4. 如果他们没有差异转到1
  5. 如果第一个字符串仍有符号,则返回FIRST_MORE
  6. 如果第二个字符串仍然有符号返回FIRST_LESS
  7. 返回SAME

这就是为什么你会得到所有文件以零开头,然后所有文件以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并根据编号进行排序.


KGC*_*beX 5

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

使用示例是:

QDir dir(pathToDirectory);
dir.setSorting(QDir::SortFlag::DirsFirst | QDir::SortFlag::Name);
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你。