memo

プログラミング備忘録

【Qt】QMap-QList備忘録

QMap、QListの備忘録を書くために色々試していると、QMapにQList、QListにQMapクラスを組み込める?ことがわかって面白いなと思いました。


例1)
QMapクラスのmapにQListのlistを組み込んで(?)ます。
mapの片方の型をQListにしています。

    QList<QString> list = {};
    QMap<QString, QList<QString>> map = {};

    list.append("Raichu");
    list.append("Pikachu");
    list.append("Pichu");

    map["Electric"] = list;

    QList<QString> tmp = {};
    for(int i=0; i<map.size(); i++){
        tmp = map.value("Electric");
    }

いつ使うのだろう……という感じですが、
とりあえずmapに型の異なるQListを代入しようとするとQtに怒られます。(エラー)



例2)
全部デバッグに表示するにはどうしたらいいのかなと思ったので、以下のようにしてみました。

    QList<QString> list = {};
    QMap<QString, QList<QString>> map = {};

    list.append("Raichu");
    list.append("Pikachu");
    list.append("Pichu");

    map["Electric"] = list;

    list.clear();

    QList<QString> tmp = {};
    for(int i=0; i<map.size(); i++){
        tmp = map.value("Electric");
    }

    // mapに入ってる値を全部出力するには?
    int len = 0;
    for(QString key : map.keys()) {
        qDebug("key= %s", qPrintable(key));
        len = map[key].length();
        for(int i=0; i<len; i++){
            map[key].value(i);
            qDebug("---> value= %s", qPrintable(map[key].value(i)));
        }
    }

出力結果

key= Electric
---> value= Raichu
---> value= Pikachu
---> value= Pichu



例3)
QListのlistにQMapのmapを代入します。

    QMap<int, QString> map;
    QList<QMap<int, QString>> list = {};

    map[25] = "Pikachu";
    map[26] = "Raichu";
    map[172] = "Pichu";
    // 追加
    list.append(map);
    // 一度clear
    map.clear();

    map[194] = "Wooper";
    map[195] = "Quagsire"; // ヌオー
    list.append(map);

    // 表示
    for(int i=0; i<list.length(); i++){
        for(int j=0; j<list.at(i).size(); j++){
            qDebug("list[%d]:value= %s", i, qPrintable(list.at(i).values().at(j)));
        }
    }

出力結果

list[0]:value= Pikachu
list[0]:value= Raichu
list[0]:value= Pichu
list[1]:value= Wooper
list[1]:value= Quagsire

デバッグ画面だと以下のようになっています。

f:id:shinopikapi:20191208003200p:plain
例3 デバッグ画面

デバッグ表示の部分で、listのatのvalueのatの……になっていて、
まあわかりますけどぱっと見わかりづらいかなと思います。
多分イテレーターとかでfor文二重化しなくとも書ける気がします。(試してない)



例4)
QListの型を独自クラスにしてみました。
独自クラスの型を持つQListのlistに適当に値を挿入しています。

pika.h

#include "rai.h"
~略~
private:

    Pichu setPichu(int no, QString name, QString type);

pika.cpp

    QList<Pichu> list;
    list.append(setPichu(25, "Pikachu", "Electric"));
    list.append(setPichu(26, "Raichu", "Electric"));
    list.append(setPichu(172, "Pichu", "Electric"));

~略~

// ↑で呼ばれる
Pichu Pika::setPichu(int no, QString name, QString type)
{
    Pichu pichu;
    pichu.no = no;
    pichu.name = name;
    pichu.type = type;

    return pichu;
}

Pichuクラスを記載。
rai.h

class Pichu
{
public:
    int no;
    QString name;
    QString type;

private:
    //
};

例4では、Pichuクラスで番号、名前、タイプをセットしてPichu型のQListに入れています。
QListとQMapでどうにかしようとするより、私はこっちの方が値を整理しやすそうで何となくわかりやすいかなと思っています。

QListの中身について、デバッグ画面では以下のようになっています。

f:id:shinopikapi:20191208012455p:plain
例4 デバッグ画面



for文二重化しなくても全部の項目表示する方法……多分あるよね……ある……よね……(探してない)



参考:
https://doc.qt.io/qt-5/qmap.html
https://doc.qt.io/qt-5/qlist.html
https://doc.qt.io/qt-5/qdebug.html