2010-07-07 13 views
6

Tüm Q_PROPERTY öğelerinin tümünü otomatik olarak yineleyecek ve bazı özellikler qRegisterMetaType ile kaydedilen türleri kullanan test kodunu yazıyorum. Bunları QVariant içine okumak/yazmak istiyorsanız, bunları varyantlara kaydederken QVariant :: UserType kullanmalıyım. Çok uzak çok iyi.QVariant türünde QVariant nasıl doğrulanır? UserType beklenen türdür?

Fakat bu özelliklerin okumalarını ve yazımlarını test etmek istediğimde, onların türünü de bilmem gerekiyor. Zaten standart qt tipleri olan şeyler için, bunu QVariant :: type() aracılığıyla yapabilirim, fakat çok fazla usertipte sahip olduğumdan, bu nasıl başarılırdı? QVariant ait API itibaren

, ben bu lekeli:

bool QVariant::canConvert (Type t) const

Ama bu halinde çeteleler yanlış türlerine yol açacaktır eğer ben biraz şüpheli değilim?

QVariant'da hangi türdeki kullanıcı tipinin depolandığını doğrulamak için kusursuz bir yol ne olurdu?

cevap

11

Kullanıcı tanımlı türler için QVariant::userType() bulunmaktadır. QVariant :: type() gibi çalışır, ancak QVariant :: type() her zaman QVariant :: UserType döndürürken kullanıcı tanımlı türün type id tamsayı değerini döndürür.

Ayrıca, yazının adını bir dize olarak döndüren QVariant::typeName() da vardır.

DÜZENLEME:

Muhtemelen QVariant set bağlıdır. Doğrudan QVariant::QVariant(int type, const void * copy) kullanılması önerilmez.

Ben QVariant saklayabilirsiniz Q_DECLARE_METATYPE olmadan

class MyFirstType 
{ 
    public: 
     MyFirstType(); 
     MyFirstType(const MyFirstType &other); 
     ~MyFirstType(); 

     MyFirstType(const QString &content); 

     QString content() const; 

    private: 
     QString m_content; 
}; 
Q_DECLARE_METATYPE(MyFirstType); 

üçüncü:

böyle üç tip var ki

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(); 

[...] 

alıyorum: Ancak

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 durumunda öyle görünüyor t :: UserType değişken, typeName() yöntemi "UserType" değerini döndürür ve typeName(), QVariant :: UserType enum değerini döndürür. Yani her ikisi de işe yaramaz – rasjani

+0

Nesne süreleri sadece iyi, ben de örnekleme de sadece iyi çalışıyor, bu yüzden typecasting ile de kontrol yapabilirim. Ama benim sorum, enum'un bir sınıf türü olmadığı ve bir sayısal değişkenin bir numaraya varsayılan olarak yazılabilmesiydi. Ama dediği gibi. Kodunu kontrol edeceğim. – rasjani

+0

Ah, üzgünüm, o kısmı fark etmedim. Denedim ve Q_DECLARE_METATYPE veya qRegisterMetaType ile bir enum tipi kaydetmek ve aynı şekilde kullanmak mümkün görünüyor. Dokümanlar sadece, sınıf veya yapının genel varsayılan yapıcısı, kopya kurucusu ve yıkıcı ile konuştuğundan emin değilim, bu yüzden tamamen emin değilim, ama yaratma, kopyalama ve imha için aynı örtük arabirime sahip herhangi bir tür için çalışması gerektiğini düşünüyorum. – Leiaz

İlgili konular