首页 文章

如何验证QVariant :: UserType类型的QVariant是期望的类型?

提问于
浏览
7

我正在编写测试代码,它将自动遍历所有Q_PROPERTY的小部件,并且一些属性正在使用通过qRegisterMetaType注册的类型 . 如果我想将它们读/写到QVariant中,我需要在将它们存储到变体中时使用QVariant :: UserType . 到现在为止还挺好 .

但是当我想测试这些属性的读写时,我还需要知道它们的类型 . 对于已经是标准qt类型的东西,我可以通过QVariant :: type()来做到这一点,但由于我有很多usertypes,这将如何实现?

从QVariant的api,我发现了这个:

bool QVariant::canConvert ( Type t ) const

但我有点怀疑这是否会导致错误类型的枚举?

那么,验证QVariant中存储哪种类型的usertype是多么简单的方法呢?

1 回答

  • 12

    对于用户定义的类型,有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();
    
     [...]
    

    我明白了:

    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
    

相关问题