はいそれではQVariantについて書いていきます。
「コンテナクラスじゃないじゃん!」そう思った方、実は私もです。しかしC++ GUI Protramming with Qt4のcontainer classesの章によると「無関係じゃねぇし。QString,QByteArray,QVariantはここで説明すっから」と書かれています。ですので私もそれに従い書いていきます。
ということでQVariantについて書いていきますが、これは簡単にいうと"いろんな型入れれるクラス"です。多数の型を扱う場合だとか、型推論に使える便利なクラスです。
QBrush,QColor...などなど多くのQtクラスとdouble, int などのC++の基本数値型、QListなどのコンテナクラスを格納できます。
サンプルはC++ GUI Programming with Qt4 269ページからを参考にします。
ではコードを
(なおGUI関係のクラスをQVariantへ入れる場合はQtGuiモジュールへのリンクが必要です。)
(コンストラクタ)
QVariant var(QIcon("sample.png")); //varにはQIconが入る //※GUI関係はQtGuiモジュールへのリンクが必要です。 QVariant var_two(1000); //var_twoにはint 1000が入る
(コンストラクタ以外での値の格納)
QVariant var.setValue(QIcon("sample.png")); //varにはQIconが入る //※GUI関係はQtGuiモジュールへのリンクが必要です。 var = QVariant("Hello!"); //varには"Hello!"が入る var = QVariant::fromValue("Hello World"); //varには"Hello World"が入る
(値の取り出し)
QVariant var(QIcon("sample.png")); //※GUI関係はQtGuiモジュールへのリンクが必要です。 QVariant var_two(1000); //取り出し //GUI関係の場合はQVariant::value<T>()を使う QIcon icon = var.value<QIcon>(); //GUI以外は多くの場合to...()を使う int num = var_two.toInt();
(コンテナを用いた複雑なデータ構造)
//キーをQString、値はほぼ何でもOK QMap<QString, QVariant> map; map["one"] = 1.95; map["two"] = "Hello!"; map["three"] = QIcon("/home/ubuntu001/icon.png"); double num; QString str; QIcon icon; //それぞれ値の型を確認してから各変数に取り出す。 //type()で確認できます。 if(QVariant::Double == map["one"].type()) { num = map["one"].toDouble(); } if(QVariant::String == map["two"].type()) { str = map["two"].toString(); } if(QVariant::Icon == map["three"].type()) { icon = map["three"].value<QIcon>(); }
(ユーザー定義クラスの格納)
//デフォルトコンストラクタと //コピーコンストラクタがなければ登録できない。 class sample { public: sample();//デフォルトコンストラクタ sample(const sample& obj);//コピーコンストラクタ }; //-------------------------------------------------- //下記のように登録さえすれば Q_DECLARE_METATYPE(sample) //登録したファイルの中でQVariantとして使える //ファイルごとにQ_DECLARE_METATYPE()を書かないと使えない。 Test::testfunc() { sample sm; QMap<QString, QVariant> map; map["one"] = QVariant::fromValue(sm);//格納 sample sm2 = map["one"].value<sample>();//取り出し } //typeはQVariant::UserTypeとなる typenameでは"sample"となる
あとはリファレンスを参照してください。
(QVariant::Typeの一覧)
以上です。