3

私のアプリケーションは、QDirIteratorを使用して、フォルダー内の.jpg画像を反復処理しています。これらの名前は、page0、page1、page2 ... page10、page11...などです。

問題は、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()ため、どちらも役に立ちません。

ファイルの名前を変更することをお勧めします。このように考えてください:

Image0
Image1
Image2
Image3
   ..。
Image9
Image10

通常の文字列並べ替えアルゴリズムは、2つの文字列間の字句比較を行います。これは次のように機能します。

  1. 次のシンボルを取る
  2. 次の記号がない場合は5に進みます
  3. 記号が異なる場合は
    • 最初のシンボルが2番目のシンボルよりも小さい場合は、FIRST_LESSを返します。
    • それ以外の場合はFIRST_MOREを返します
  4. 違いがなければgoto1
  5. 最初の文字列にまだ記号が含まれている場合は、FIRST_MOREを返します
  6. 2番目の文字列にまだ記号が含まれている場合は、FIRST_LESSを返します
  7. 同じものを返す

これが、最初にゼロで始まるすべてのファイルを取得し、次に1で始まるすべてのファイルを取得する理由です。

Image0
Image1
Image10; 1<2だから
Image11; 1<2だから
Image12; 1<2だから
 ..。
Image2
Image20; 2<3だから
Image21; 2<3だから
Image22; 2<3だから
 ..。

これを修正する最も簡単な方法は、ファイル名を変更することです。それ以外の場合は、独自のファイル名パーサーを作成する必要があります。このパーサーは、ファイル名を取得し、名前+番号に分割し、番号に従って並べ替えます。

于 2012-11-11T14:12:39.463 に答える
8

これは古い質問ですが、Qt 5.13の更新された回答は、QDirオブジェクトでQDir::SortFlagを使用することです

使用例は次のとおりです。

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

これにより、最初にディレクトリが並べ替えられ、次にすべてのdirs/ファイルが名前で並べ替えられます。

それが役に立てば幸い。

于 2019-09-05T13:35:47.650 に答える