【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
デバッグ画面だと以下のようになっています。
デバッグ表示の部分で、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の中身について、デバッグ画面では以下のようになっています。
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