How to use QVariant/ja

From Qt Wiki
Revision as of 15:52, 14 January 2015 by Maintenance script (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

QVariant の使い方

QVariant は様々な型を格納できる便利なクラスです。実行時までデータの型が定まらない場合や、多数の型に対応する必要がある場合などに役に立ちます。この記事では QVariant の基本的な使い方を説明します。

QVariant の内部実装については QVariant を参考にしてください。

QVariant が対応している型

QVariant はデフォルトで int や bool, double といった C の型から、QByteArray, QString, QUrl, QRect 等と言った Qt の型まで多数の型に対応しています。

QVariant に値を格納するには以下のメソッドを使います。

  • コンストラクタ
  • QVariant::setValue(const T &value)
  • QVariant::fromValue(const T &value) [static]
  • qVariantFromValue(const T &value) [static]

逆に、QVariant から価を取り出す場合には以下のメソッドを使います。

  • QVariant:: toType() (ex. toInt(), toReal(), toString() etc.)
  • QVariant::value<T>()
  • qvariant_cast<T>(const QVariant &value) [static]
  • qVariantValue<T>(const QVariant &value) [static]

なお、QVariant が指定した型に変換できない場合にはその型のデフォルトコンストラクタで作成した値が返ります。変換可能かどうかを知る必要がある場合には QVariant::canConvert(Type t) や QVariant::canConvert<T>() を使ってください。
なお、 Int <-> Real のように元々互いの型が変換可能な場合、int を格納した QVariant を通じて qreal を取り出すこともできます。

ex.

詳しくは QVariant のリファレンスを参照してください。

QVariant がデフォルトで対応していない型

ポインタ型(文字列として扱われる const char * は除く)や独自クラスなどには QVariant は対応していないため、対応している型のようには QVariant に値を格納できません。しかし、以下のような方法で QVariant を使用することができます。

QMetaType に登録済みの型

QVariant に値を格納するには、その方が QMetaType に登録されている必要があります。
たとえば、ポインタ型は QVariant でコンストラクタや to 変換関数が用意されていませんが、void *, QObject *, QWidget * については QMetaType にデフォルトで登録されています。
このように、QMetaType に登録済みの型については QVariant::fromValue() や QVariant::value<T>() を用いて扱うことができます。

ex.

ポインタ型を扱いたい場合には、これらのどれかのポインタにキャストして使うのも手でしょう。QObject や QWidget を継承したクラスのポインタの場合には、QObject * や QWidget * と qobject_cast が使えます。

ex.

QMetaType に登録されていない型

ポインタ型をキャストせずにそのまま扱いたい場合や、独自クラスなど QMetaType に登録されていない型の場合には Q_DECLARE_METATYPE マクロを用いて登録を行います。

ex.

Q_DECLARE_METATYPE で登録を行えば、その後は QMetaType に登録済みの型と同じ手法で QVariant で扱えます。

注意: QVariant への値の格納はコピーを伴います。クラスや struct 等を扱う場合には、その構成によっては注意してください。なお、 QObject (およびその派生クラス)はインスタンスそのもののコピーは 出来ません [doc.qt.nokia.com]

Categories: