1. ホーム
  2. qt

[解決済み] QVariant::UserType 型の QVariant が期待された型であることを確認するにはどうすればよいですか?

2022-02-12 06:25:37

質問

私は、ウィジェットのすべてのQ_PROPERTYを自動的に反復するテストコードを書いていて、いくつかのプロパティはqRegisterMetaTypeを介して登録されたタイプを使用しています。もし、これらをQVariantに読み書きしたい場合、それらをバリアントに保存するときにQVariant::UserTypeを使用する必要があります。ここまではいい感じです。

しかし、これらのプロパティの読み取りと書き込みをテストしたい場合、それらの型も知る必要があります。すでに標準的なqtの型であるものについては、私はQVariant::type()を介してこれを行うことができますが、私は多くのユーザー型を持っているので、これはどのように達成されるのでしょうか?

QVariantのapiから、こんなのを発見しました。

bool QVariant::canConvert ( Type t ) const

しかし、enumの場合、間違った型にならないか少し疑問です?

では、QVariantに格納されているusertypeの種類を確認する確実な方法は何でしょうか?

解決方法は?

ユーザー定義型には QVariant::userType() . QVariant::type() が常に QVariant::UserType を返すのに対して、これは QVariant::type() と同様に動作しますが、ユーザー定義型の型 ID を整数で返します。

また QVariant::typeName() これは型の名前を文字列で返します。

EDIT :

おそらく、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