如何验证 QVariant 类型为 QVariant::UserType 的变量是否是期望的类型?

9
我正在编写测试代码,将自动迭代所有小部件的Q_PROPERTY,并且某些属性使用通过qRegisterMetaType注册的类型。如果我想要将它们读取/写入QVariant,则需要在存储到variant时使用QVariant :: UserType。目前为止还不错。
但是当我想测试这些属性的读写时,我也需要知道它们的类型。对于已经是标准qt类型的东西,我可以通过QVariant :: type()来做到这一点,但是由于我有很多用户定义类型,应该如何完成呢?
从QVariant的API中,我发现了这个:
bool QVariant :: canConvert(Type t)const
但是我有些怀疑,如果涉及枚举类型,这是否会导致错误的类型?
那么,有什么绝对可靠的方法来验证存储在QVariant中的usertype的类型是什么?
1个回答

16

对于用户定义类型,可以使用QVariant::userType()。它类似于QVariant :: type()但返回用户定义类型的类型ID整数,而QVariant :: type()始终返回QVariant :: UserType。

还有QVariant :: typeName()返回类型名称作为字符串。

编辑:

这可能取决于您如何设置QVariant。不建议直接使用QVariant :: QVariant(int type,const void * copy)

假设我有以下三种类型:

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 的第三种方式

我将它们存储在 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();

 [...]

I get :

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 

然而,在QVariant :: UserType变量的情况下,typeName()方法返回“UserType”,而typeName()返回QVariant :: UserType枚举值。因此,两者都无用。 - rasjani
对象乘法是完全正常的,我也可以通过类型转换进行检查,所以你的示例应该也可以很好地工作。但是我的问题是关于枚举的,它不是一个类类型,可能可以将任何数字变量转换为枚举。但正如我所说的,我会检查你的代码。 - rasjani
啊,抱歉,我没有注意到那一部分。我尝试了一下,看起来可以使用Q_DECLARE_METATYPE或qRegisterMetaType注册枚举类型,并以相同的方式使用它。文档只讨论具有公共默认构造函数、复制构造函数和析构函数的类或结构体,所以我不完全确定,但我认为对于任何具有相同隐式创建、复制和销毁接口的类型都应该可以工作。 - Leiaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接