28

を使用してディレクトリの内容を読んでいQDir::entryList()ます。内のファイル名は次のように構成されています。

index_randomNumber.png

indexWindows エクスプローラーがファイルを並べ替えて、次のように並べ替える必要があります。

0_0815.png
1_4711.png
2_2063.png
...

並べ替えで得られるものの代わりにQDir::Name

0_0815.png
10000_6661.png
10001_7401.png
...

これを達成するための組み込みの方法がQtにありますか?そうでない場合、それを実装する適切な場所は何ですか?

4

6 に答える 6

13

Qt には、Qt 5.2 まで自然な並べ替えの実装がありませんでした。この機能のリクエストを参照してください。

Qt 5.2 以降、数値モードが有効な場合に自然な並べ替えを可能にする QCollat​​orがあります。

于 2012-08-14T06:57:33.533 に答える
2

はい、可能です。

そのためにQDir. 物体。コンストラクタは

 QDir(const QString & path, const QString & nameFilter, SortFlags sort = SortFlags( Name | IgnoreCase ), Filters filters = AllEntries)

使用することもできます

QDir dir;
dir.setSorting(QDir::LocaleAware);
于 2012-08-13T12:12:02.843 に答える
-1

Qt は自然な並べ替えをネイティブにサポートしていませんが、非常に簡単に実装できます。たとえば、これを使用して次のように並べ替えることができますQStringList

struct naturalSortCompare {

    inline bool isNumber(QChar c) {
        return c >= '0' && c <= '9';
    }

    inline bool operator() (const QString& s1, const QString& s2) {
        if (s1 == "" || s2 == "") return s1 < s2;

        // Move to the first difference between the strings
        int startIndex = -1;
        int length = s1.length() > s2.length() ? s2.length() : s1.length();
        for (int i = 0; i < length; i++) {
            QChar c1 = s1[i];
            QChar c2 = s2[i];
            if (c1 != c2) {
                startIndex = i;
                break;
            }
        }

        // If the strings are the same, exit now.
        if (startIndex < 0) return s1 < s2;

        // Now extract the numbers, if any, from the two strings.
        QString sn1;
        QString sn2;
        bool done1 = false;
        bool done2 = false;
        length = s1.length() < s2.length() ? s2.length() : s1.length();

        for (int i = startIndex; i < length; i++) {
            if (!done1 && i < s1.length()) {
                if (isNumber(s1[i])) {
                    sn1 += QString(s1[i]);
                } else {
                    done1 = true;
                }
            }

            if (!done2 && i < s2.length()) {
                if (isNumber(s2[i])) {
                    sn2 += QString(s2[i]);
                } else {
                    done2 = true;
                }
            }

            if (done1 && done2) break;
        }

        // If none of the strings contain a number, use a regular comparison.
        if (sn1 == "" && sn2 == "") return s1 < s2;

        // If one of the strings doesn't contain a number at that position,
        // we put the string without number first so that, for example,
        // "example.bin" is before "example1.bin"
        if (sn1 == "" && sn2 != "") return true;
        if (sn1 != "" && sn2 == "") return false;

        return sn1.toInt() < sn2.toInt();
    }

};

次に、使用法は簡単です:

std::sort(stringList.begin(), stringList.end(), naturalSortCompare());
于 2014-07-10T22:12:57.300 に答える