How to use QVariant/ja

From Qt Wiki
Revision as of 09:32, 25 February 2015 by Maintenance script (talk | contribs)
Jump to navigation Jump to search


[toc align_right="yes" depth="3"]

QVariant の使い方

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

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

QVariant が対応している型

QVariant はデフォルトで int や bool, double といった C の型から、Doc:QByteArray, Doc:QString, Doc:QUrl, Doc: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.

int intValue1;
QVariant var(intValue1);
int intValue2 = var.toInt();

qreal realValue1;
var = QVariant(realValue1);
qreal realValue2 = var.toReal();

QString str1;
var.setValue(str);
QString str2 = var.toString();

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

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

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

QMetaType に登録済みの型

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

ex.

void *ptr;

QVariant var = QVariant::fromValue(ptr);

void '''ptr2 = var.value<void'''>();

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

ex.

MyWidget '''widget = new MyWidget;

QVariant var = QVariant::fromValue(static_cast<QWidget'''>(widget);

MyWidget '''widget2 = qobject_cast<MyWidget'''>(var.value<QWidget *>());

QMetaType に登録されていない型

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

ex.

class MyClass
{

};

Q_DECLARE_METATYPE(MyClass)

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