我正在编写测试代码,该代码将通过所有Q_property of Widgets自动迭代,并且某些属性正在使用通过QRegisterMetateme注册的类型。如果我想将它们读/写入qvariant,则在将它们存储到变体中时需要使用qvariant :: usertype。到现在为止还挺好。

但是,当我想测试这些属性的阅读和写入时,我还需要知道它们的类型。对于已经是标准QT类型的内容,我可以通过qvariant :: type()来执行此操作,但是由于我有很多用电类型,这将如何实现?

从Qvariant的API中,我发现了这一点:

bool QVariant::canConvert ( Type t ) const

但是,如果枚举会导致错误的类型,我有点怀疑吗?

那么,验证QVariant中存储哪种类型的USERTYPE的万无一失的方法是什么?

有帮助吗?

解决方案

对于用户定义的类型,有 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 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top