Qt QList<QMap<QString,QString>>のソート

MEMO
QListに入れたQMapをソートするサンプルです
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtAlgorithms>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    // keyで降順に比較する比較関数
    bool compareMapsDescending(const QMap<QString, QString> &map1, const QMap<QString, QString> &map2, const QString &key) {
        bool isNumber1 = map1.value(key).toInt();
        bool isNumber2 = map2.value(key).toInt();
        if (isNumber1 && isNumber2) {
            // 数値で比較
            return map1.value(key).toInt() > map2.value(key).toInt();
        } else {
            // 文字列で比較
            return map1.value(key) > map2.value(key);
        }
    }
    // keyで昇順に比較する比較関数
    bool compareMapsAscending(const QMap<QString, QString> &map1, const QMap<QString, QString> &map2, const QString &key) {
        bool isNumber1 = map1.value(key).toInt();
        bool isNumber2 = map2.value(key).toInt();
        if (isNumber1 && isNumber2) {
            // 数値で比較
            return map1.value(key).toInt() < map2.value(key).toInt();
        } else {
            // 文字列で比較
            return map1.value(key) < map2.value(key);
        }
    }
};
#endif // MAINWINDOW_H
mainwindow.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMap<QString, QString> dataMap;
    QList<QMap<QString, QString>> dataList;
    // dataListの初期化
    dataMap.insert("id",   "0");
    dataMap.insert("key1", "100");
    dataMap.insert("key2", "10");
    dataList.append(dataMap);
    dataMap.clear();
    dataMap.insert("id",   "1");
    dataMap.insert("key1", "100");
    dataMap.insert("key2", "20");
    dataList.append(dataMap);
    dataMap.clear();
    dataMap.insert("id",   "2");
    dataMap.insert("key1", "200");
    dataMap.insert("key2", "20");
    dataList.append(dataMap);
    dataMap.clear();
    dataMap.insert("id",   "3");
    dataMap.insert("key1", "300");
    dataMap.insert("key2", "10");
    dataList.append(dataMap);

    qDebug() << "-----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // (1) key1で降順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key = "key1";
        return compareMapsDescending(map1, map2, key);
    });
    qDebug() << "-(1)----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // (2) key2で昇順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key = "key2";
        return compareMapsAscending(map1, map2, key);
    });
    qDebug() << "-(2)----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // idで昇順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key = "id";
        return compareMapsAscending(map1, map2, key);
    });
    qDebug() << "-----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // (3) key1で降順かつkey2で昇順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key_1 = "key1";
        const QString key_2 = "key2";
        if (map1.value(key_1).toInt() > map2.value(key_1).toInt()) {        // key1で降順
            return true;
        }
        else if ((map1.value(key_1).toInt() == map2.value(key_1).toInt())
              && (map1.value(key_2).toInt() < map2.value(key_2).toInt())) { // key2で昇順
            return true;
        } else {
            return false;
        }
    });
    qDebug() << "-(3)----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // (4) key2で降順かつkey1で昇順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key_1 = "key1";
        const QString key_2 = "key2";
        if (map1.value(key_2).toInt() > map2.value(key_2).toInt()) {        // key2で降順
            return true;
        }
        else if ((map1.value(key_2).toInt() == map2.value(key_2).toInt())
              && (map1.value(key_1).toInt() < map2.value(key_1).toInt())) { // key1で昇順
            return true;
        } else {
            return false;
        }
    });
    qDebug() << "-(4)----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // (5) key1で昇順かつkey2で降順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key_1 = "key1";
        const QString key_2 = "key2";
        if (map1.value(key_1).toInt() < map2.value(key_1).toInt()) {        // key1で昇順
            return true;
        }
        else if ((map1.value(key_1).toInt() == map2.value(key_1).toInt())
              && (map1.value(key_2).toInt() > map2.value(key_2).toInt())) { // key2で降順
            return true;
        } else {
            return false;
        }
    });
    qDebug() << "-(5)----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";

    // (6) key2で昇順かつkey1で降順にソートする
    std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
        const QString key_1 = "key1";
        const QString key_2 = "key2";
        if (map1.value(key_2).toInt() < map2.value(key_2).toInt()) {        // key2で昇順
            return true;
        }
        else if ((map1.value(key_2).toInt() == map2.value(key_2).toInt())
              && (map1.value(key_1).toInt() > map2.value(key_1).toInt())) { // key1で降順
            return true;
        } else {
            return false;
        }
    });
    qDebug() << "-(6)----";
    for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
}

MainWindow::~MainWindow()
{
    delete ui;
}

重要
数値は.toInt()で文字列から数値に変換して大小比較する

アプリケーション出力
—–
[ “0” “100” “10” ]
[ “1” “100” “20” ]
[ “2” “200” “20” ]
[ “3” “300” “10” ]
-(1)—-
[ “3” “300” “10” ]
[ “2” “200” “20” ]
[ “0” “100” “10” ]
[ “1” “100” “20” ]
-(2)—-
[ “3” “300” “10” ]
[ “0” “100” “10” ]
[ “2” “200” “20” ]
[ “1” “100” “20” ]
—–
[ “0” “100” “10” ]
[ “1” “100” “20” ]
[ “2” “200” “20” ]
[ “3” “300” “10” ]
-(3)—-
[ “3” “300” “10” ]
[ “2” “200” “20” ]
[ “0” “100” “10” ]
[ “1” “100” “20” ]
-(4)—-
[ “1” “100” “20” ]
[ “2” “200” “20” ]
[ “0” “100” “10” ]
[ “3” “300” “10” ]
-(5)—-
[ “1” “100” “20” ]
[ “0” “100” “10” ]
[ “2” “200” “20” ]
[ “3” “300” “10” ]
-(6)—-
[ “3” “300” “10” ]
[ “0” “100” “10” ]
[ “2” “200” “20” ]
[ “1” “100” “20” ]