How to use QVariant/ja: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
=QVariant の使い方=
[[Category:Developing_with_Qt::General]]<br />[[Category:HowTo]]<br />[[Category:Learning]]<br />[[Category:Japanese]]


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


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


==QVariant が対応している型==
== QVariant が対応している型 ==


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


QVariant に値を格納するには以下のメソッドを使います。
QVariant に値を格納するには以下のメソッドを使います。<br />* コンストラクタ<br />* QVariant::setValue(const T &amp;value)<br />* QVariant::fromValue(const T &amp;value) [static]<br />* qVariantFromValue(const T &amp;value) [static]


* コンストラクタ
逆に、QVariant から価を取り出す場合には以下のメソッドを使います。<br />* QVariant:: ''toType()'' (ex. toInt(), toReal(), toString() etc.)<br />* QVariant::value&amp;lt;T&amp;gt;()<br />* qvariant_cast&amp;lt;T&amp;gt;(const QVariant &amp;value) [static]<br />* qVariantValue&amp;lt;T&amp;gt;(const QVariant &amp;value) [static]
* QVariant::setValue(const T &amp;value)
* QVariant::fromValue(const T &amp;value) [static]
* qVariantFromValue(const T &amp;value) [static]


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


* QVariant:: ''toType()'' (ex. toInt(), toReal(), toString() etc.)
ex.<br /><code><br />int intValue1;<br />QVariant var(intValue1);<br />int intValue2 = var.toInt();
* QVariant::value&lt;T&gt;()
* qvariant_cast&lt;T&gt;(const QVariant &amp;value) [static]
* qVariantValue&lt;T&gt;(const QVariant &amp;value) [static]


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


ex.<br />
QString str1;<br />var.setValue(str);<br />QString str2 = var.toString();<br /></code>


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


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


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


===QMetaType に登録済みの型===
=== QMetaType に登録済みの型 ===


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


ex.<br />
ex.<br /><code><br />void *ptr;<br />…<br />QVariant var = QVariant::fromValue(ptr);<br />…<br />void '''ptr2 = var.value&amp;lt;void'''&gt;();<br /></code>


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


ex.<br />
ex.<br /><code><br />MyWidget '''widget = new MyWidget;<br />…<br />QVariant var = QVariant::fromValue(static_cast&amp;lt;QWidget'''&gt;(widget);<br />…<br />MyWidget '''widget2 = qobject_cast&amp;lt;MyWidget'''&gt;(var.value&amp;lt;QWidget *&gt;());<br /></code>


===QMetaType に登録されていない型===
=== QMetaType に登録されていない型 ===


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


ex.<br />
ex.<br /><code><br />class MyClass<br />{<br />…<br />};
 
Q_DECLARE_METATYPE(MyClass)<br /></code>


Q_DECLARE_METATYPE で登録を行えば、その後は QMetaType に登録済みの型と同じ手法で QVariant で扱えます。
Q_DECLARE_METATYPE で登録を行えば、その後は QMetaType に登録済みの型と同じ手法で QVariant で扱えます。
'''注意:''' QVariant への値の格納はコピーを伴います。クラスや struct 等を扱う場合には、その構成によっては注意してください。なお、 QObject (およびその派生クラス)はインスタンスそのもののコピーは [http://doc.qt.nokia.com/latest/qobject.html#no-copy-constructor-or-assignment-operator '''出来ません'''] ''[doc.qt.nokia.com]'' 。
===Categories:===
* [[:Category:Developing with Qt|Developing_with_Qt]]
** [[:Category:Developing with Qt::General|General]]
* [[:Category:HowTo|HowTo]]
* [[:Category:Japanese|Japanese]]
* [[:Category:Learning|Learning]]

Revision as of 09:02, 24 February 2015




[toc align_right="yes&quot; depth="3&quot;]

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&lt;T&gt;()
* qvariant_cast&lt;T&gt;(const QVariant &value) [static]
* qVariantValue&lt;T&gt;(const QVariant &value) [static]

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

ex.

<br />int intValue1;<br />QVariant var(intValue1);<br />int intValue2 = var.toInt();

qreal realValue1;<br />var = QVariant(realValue1);<br />qreal realValue2 = var.toReal();

QString str1;<br />var.setValue(str);<br />QString str2 = var.toString();<br />

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

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

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

QMetaType に登録済みの型

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

ex.

<br />void *ptr;<br /><br />QVariant var = QVariant::fromValue(ptr);<br /><br />void '''ptr2 = var.value&amp;lt;void'''&gt;();<br />

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

ex.

<br />MyWidget '''widget = new MyWidget;<br /><br />QVariant var = QVariant::fromValue(static_cast&amp;lt;QWidget'''&gt;(widget);<br /><br />MyWidget '''widget2 = qobject_cast&amp;lt;MyWidget'''&gt;(var.value&amp;lt;QWidget *&gt;());<br />

QMetaType に登録されていない型

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

ex.

<br />class MyClass<br />{<br /><br />};

Q_DECLARE_METATYPE(MyClass)<br />

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