タイプqvariant :: usertypeのqvariantを検証する方法は、予想されるタイプですか?
質問
ウィジェットのすべてのQ_Propertyを自動的に繰り返すテストコードを作成しています。一部のプロパティは、QREGISTERMETATYPEを介して登録されているタイプを使用しています。これらをqvariantに読み取り/書きたい場合は、qvariant :: usertypeをバリエーションに保存するときに使用する必要があります。ここまでは順調ですね。
しかし、これらのプロパティの読み取りと書き込みをテストしたい場合は、それらのタイプも知る必要があります。既に標準のQTタイプであるものについては、QVariant :: Type()を介してこれを行うことができますが、多くのユーザータイプがあるので、これはどのように達成されますか?
QVariantのAPIから、これを見つけました。
bool QVariant::canConvert ( Type t ) const
しかし、これが酵素の場合にこれが間違ったタイプにつながるかどうかは少し疑わしいですか?
それでは、QVariantに保存されているタイプのUSERTYPEを確認するための絶対確実な方法は何でしょうか?
解決
ユーザー定義のタイプにはあります qvariant :: usertype(). 。 qvariant :: type()のように動作しますが、qvariant :: type()は常にqvariant :: usertypeを返しますが、ユーザー定義タイプのタイプID整数を返します。
もあります qvariant :: typename() タイプの名前を文字列として返します。
編集 :
おそらく、QVariantの設定方法に依存します。直接使用します qvariant :: qvariant(int type、const void * copy) 落胆しています。
私はこのような3つのタイプを持っているとします:
class MyFirstType
{
public:
MyFirstType();
MyFirstType(const MyFirstType &other);
~MyFirstType();
MyFirstType(const QString &content);
QString content() const;
private:
QString m_content;
};
Q_DECLARE_METATYPE(MyFirstType);
q_declare_metatypeなしの3番目
私はそれらをqvariantに保存します:
QString content = "Test";
MyFirstType first(content);
MySecondType second(content);
MyThirdType third(content);
QVariant firstVariant;
firstVariant.setValue(first);
QVariant secondVariant = QVariant::fromValue(second);
int myType = qRegisterMetaType<MyThirdType>("MyThirdType");
QVariant thirdVariant(myType, &third); // Here the type isn't checked against the data passed
qDebug() << "typeName for first :" << firstVariant.typeName();
qDebug() << "UserType :" << firstVariant.userType();
qDebug() << "Type : " << firstVariant.type();
[...]
わかりました:
typeName for first : MyFirstType
UserType : 256
Type : QVariant::UserType
typeName for second : MySecondType
UserType : 257
Type : QVariant::UserType
typeName for third : MyThirdType
UserType : 258
Type : QVariant::UserType