QVariant と ポインタ と Q_DECLARE_METATYPE の話

Qt @福岡 第4回勉強会 http://atnd.org/events/16118 の懇親会であった質問
1
Tasuku Suzuki @task_jp

@vivisuke QVariant に入れられないって言ってたのって何のポインターでしたっけ? #qtjp

2011-08-03 02:12:47
リモートなお仕事募集中でござるぞ @vivisuke

void * だお。でも今ヘルプをよーく見なおしたら、cchar * は大丈夫なのね。。。 QT @task_jp QVariant に入れられないって言ってたのって何のポインターでしたっけ? #qtjp

2011-08-03 06:29:05
Atsushi @Atsushi4

横槍で。。。Q_DECLARE_METATYPEしたら単純なクラス,構造体やポインタは何でもいけますですよ。 #qtjp RT @vivisuke: void * だお。でも今ヘルプをよーく見なおしたら、cchar * は大丈夫なのね。。。

2011-08-03 06:45:04
リモートなお仕事募集中でござるぞ @vivisuke

アドバイスさんくす~。調べてみるお>Q_DECLARE_METATYPE QT @Atsushi4 Q_DECLARE_METATYPEしたら単純なクラス,構造体やポインタは何でもいけますですよ。 #qtjp

2011-08-03 06:49:58
Atsushi @Atsushi4

@vivisuke あ,qVariantFromValue(又はQVariant::fromValue)とqVariantValue(又はQVariant::value)は毎回必要だと思います。 #qtjp

2011-08-03 08:42:45
リモートなお仕事募集中でござるぞ @vivisuke

さらにヘルプをよく見たら QVariant(cchar *) は文字列で、toCCharPtr() など無かった orz QT @task_jp void * だお。でも今ヘルプをよーく見なおしたら、cchar * は大丈夫なのね。 #qtjp

2011-08-03 09:01:50
リモートなお仕事募集中でござるぞ @vivisuke

@Atsushi4 ヘルプには「MyStruct s; QVariant var; var.setValue(s);」とか「MyStruct s2 = var.value<MyStruct>();」とか書いてあるけど、これじゃダメなの? #qtjp

2011-08-03 09:03:31
Atsushi @Atsushi4

@vivisuke あ,それでOKです。説明が下手糞で申し訳ない。しかもsetValueは忘れてました。。。Q_DECLARE_METATYPEした型とQVariant間は変換関数が要る,と言いたかったです。 #qtjp

2011-08-03 09:08:05
Atsushi @Atsushi4

文字列でないchar*をQVariantで扱うならQByteArrayではいかがでしょう。 RT @vivisuke: さらにヘルプをよく見たら QVariant(cchar *) は文字列で、toCCharPtr() など無かった orz #qtjp

2011-08-03 09:18:21
Atsushi @Atsushi4

@vivisuke void*でしたねスミマセン。Q_DECLARE_METATYPE(void*)してQVariant var = qVariantFromValue<void*>(ptr); qDebug() << v.value<void*>();はいけました。 #qtjp

2011-08-03 09:25:55
リモートなお仕事募集中でござるぞ @vivisuke

おーっそんな簡単なんだ。いと素晴らし。QT @Atsushi4 Q_DECLARE_METATYPE(void*)してQVariant var = qVariantFromValue<void*>(ptr); qDebug() << v.value<void*>(); #qtjp

2011-08-03 09:37:01
Atsushi @Atsushi4

そういえばQ_DECLARE_METATYPE(MyType)するならMyTypeを宣言してるヘッダの末尾がよさげだけどvoid*はどこでしたらいいんだろう。使うcppのincludeの下辺りに書いてみたけど。いや,そもそもvoid*は型安全じゃないかw #qtjp

2011-08-03 09:37:58
Atsushi @Atsushi4

Q_DECLARE_METATYPE(MyType)するならpublicなデフォルトコンストラクタ,コピーコンストラクタ,デストラクタが必要。でもQ_DECLARE_METATYPE(MyType*)してポインタで扱う方がスライシングの心配も無くて良い気がする。 #qtjp

2011-08-03 09:44:03
Atsushi @Atsushi4

C++ Coding Standardsでもポインタのコンテナを使用するべきだと書いてるし,QVariantもコピーのコストを考えるとクラスの場合はポインタを格納する方が効率が良さそうに思う。 #qtjp

2011-08-03 09:49:21
Atsushi @Atsushi4

なんてこったい。知ったかぶりでお恥ずかしい(;´Д`A RT @takumiasaki: @Atsushi4 @vivisuke void *はQMetaType::VoidStar としてMeta Typeにはデフォルトで登録済み #qtjp

2011-08-03 12:10:52
朝木卓見 @takumiasaki

@Atsushi4 @vivisuke void *はQMetaType::VoidStar としてMeta Typeにはデフォルトで登録済みです。Q_DECLARE_METATYPE()は要りません。 #qtjp

2011-08-03 11:19:18
Atsushi @Atsushi4

@takumiasaki @vivisuke なるほど。そのままQVariant v = qVariantFromValue<void*>(ptr);qDebug() << v.value<void*>();でいけました。ありがとうございます。#qtjp

2011-08-03 12:50:29
Atsushi @Atsushi4

家で書いた時にコンパイルエラーになったのはqVariantFromValueのtemplate引数void*を省略してたのかも。帰ったらもう一度確認してみよう。 #qtjp

2011-08-03 12:55:14