Как перебрать QMap в другой QMap - PullRequest
0 голосов
/ 15 марта 2019

Я ищу, как перебрать QMap в другом QMap как:

QMap<int, QMap<int, QString>> map;

Ранее я использовал простой C ++ std::map со следующим кодом, и это работало:

for(auto it = this->liste.begin(); it != this->liste.end(); it++) {
    for(auto itr = it->second.begin(); itr != it->second.end(); itr++) {
        //It works !!!!!
        //qDebug() << "First : " << itr->first;
        //qDebug() << "Second : " << itr->second;

        //d.setPath(itr->second);

        //qDebug() << "Path :" << itr->second << " Prefix :" << this->prefix << " Nb :" << itr->first;
        process(d.absolutePath(), this->prefix, itr->first);

        this->liste.clear();
    }
}

Мой вопрос заключается в том, как я мог бы использовать QMap вместо std::map, чтобы использовать QMap в QTreeView с циклом foreach (в частности, для QList сэлементы).

Какая замена для liste.first и liste.second?

Редактировать:

std::map<int, std::map<int, QString>> liste;

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете использовать QMap::keys() с QMap::value() или QMap::operator[], чтобы перебрать список по ключам, а затем использовать ключи для получения значений , Другим решением может быть просто получить std::map из QMap::toStdMap() и выполнить итерацию по нему, используя цикл range-for.

Возможно, вы захотите взглянуть на QMap::uniqueKeys(), также в зависимости от вашего варианта использования.


UPDATE

Как указано в ответе cuda12 , вы также можете использовать QMapIterator или QMutableMapIterator, в зависимости от того, что вы необходимо использовать итераторы в стиле Java, но он менее эффективен, чем итераторы в стиле STL. И это не отвечает вашему требованию использования foreach или range-for.

Вот цитата из документации :

Итераторы в стиле Java являются более высокоуровневыми и более простыми в использовании, чем итераторы в стиле STL; с другой стороны, они немного менее эффективны.


Вот рабочий пример:

#include <QDebug>
#include <QMap>
#include <QMapIterator>
#include <QString>

int main()
{
    using InnerMap = QMap<int, QString>;
    using OuterMap = QMap<int, InnerMap>;

    const OuterMap outerMap
    {
        { 1, {{ 11, "a" }, { 12, "aa" }} },
        { 2, {{ 22, "b" }, { 21, "bb" }} },
        { 3, {{ 22, "c" }} }
    };

    qDebug() << "--- foreach (QMap) ---";

    foreach ( const auto& outerKey, outerMap.keys() )
    {
        qDebug() << outerKey;

        const auto& innerMap = outerMap[ outerKey ];
        foreach ( const auto& innerKey, innerMap.keys() )
        {
            const auto& innerValue = innerMap[ innerKey ];
            qDebug() << "\t{" << innerKey << "," << innerValue << "}";
        }
    }

    qDebug() << "\n--- range-for (QMap -> std::map) ---";

    const auto& m1 = outerMap.toStdMap();
    for ( const auto& p1 : m1 )
    {
        qDebug() << p1.first;

        const auto& m2 = p1.second.toStdMap();
        for ( const auto& p2 : m2 )
        {
            qDebug() << "\t{" << p2.first << "," << p2.second << "}";
        }
    }

    qDebug() << "\n--- while (QMapIterator) ---";

    QMapIterator<int, InnerMap> outerIt{ outerMap };
    while ( outerIt.hasNext() )
    {
        outerIt.next();
        qDebug() << outerIt.key();

        QMapIterator<int, QString> innerIt{ outerIt.value() };
        while ( innerIt.hasNext() )
        {
            innerIt.next();
            qDebug() << "\t{" << innerIt.key() << "," << innerIt.value() << "}";
        }
    }

    return 0;
}

Выход:

--- foreach (QMap) ---
1
        { 11 , "a" }
        { 12 , "aa" }
2
        { 21 , "bb" }
        { 22 , "b" }
3
        { 22 , "c" }

--- range-for (QMap -> std::map) ---
1
        { 11 , "a" }
        { 12 , "aa" }
2
        { 21 , "bb" }
        { 22 , "b" }
3
        { 22 , "c" }

--- while (QMapIterator) ---
1
        { 11 , "a" }
        { 12 , "aa" }
2
        { 21 , "bb" }
        { 22 , "b" }
3
        { 22 , "c" }
0 голосов
/ 15 марта 2019

Я бы использовал класс QMapIterator .Смотрите пример документа:

QMap<int, QWidget*> map;
// ...
QMapIterator<int, QWidget*> i(map);
while (i.hasNext()) {
    i.next();
    qDebug() << i.key() << ": " << i.value();
}
...