2010-07-07 28 views
6

我正在編寫測試代碼,它將自動迭代所有Q_PROPERTY的窗口小部件,並且某些屬性使用通過qRegisterMetaType註冊的類型。如果我想讀/寫這些到QVariant我需要使用QVariant :: UserType時,將它們存儲到變體。到現在爲止還挺好。如何驗證類型QVariant :: UserType的QVariant是否爲預期類型?

但是,當我想測試讀寫這些屬性,我需要也知道他們的類型。對於已經是標準qt類型的東西,我可以通過QVariant :: type()來做到這一點,但由於我有很多usertypes,這將如何完成?

從的QVariant的API,我看準了這一點:

bool QVariant::canConvert (Type t) const

但我有點懷疑我,如果這將在枚舉的情況下,導致錯誤的類型?

那麼,用什麼方法來驗證QVariant中存儲哪種類型的usertype?

回答

11

對於用戶定義的類型,有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 
+0

然而,似乎是QVarian的情況t :: UserType變體,typeName()方法返回「UserType」,typeName()返回QVariant :: UserType枚舉值。所以兩者都沒用 – rasjani 2010-07-08 00:08:06

+0

對象時間就好了,我可以用類型轉換來做檢查,所以你的例子也可以正常工作。但我的問題是關於枚舉的不是類的類型,而是可以將任何數字變量類型化爲枚舉。但是就像這樣說。我會檢查你的代碼。 – rasjani 2010-07-08 11:50:41

+0

啊,對不起,我沒有注意到那一部分。我試過了,它看起來像使用Q_DECLARE_METATYPE或qRegisterMetaType註冊枚舉類型並以相同的方式使用它。該文檔只是談論與公共默認構造函數,複製構造函數和析構函數的類或結構,所以我不完全確定,但我認爲它應該適用於任何具有相同的創建,複製和銷燬的隱式接口的類型。 – Leiaz 2010-07-09 17:37:10