Domanda

Sto scrivendo il codice di test che verrà automaticamente iterare attraverso tutti Q_PROPERTY di di widget e di alcune proprietà utilizzano tipi che sono registrati tramite qRegisterMetaType. Se voglio leggere / scrivere questi in QVariant ho bisogno di usare QVariant :: UserType quando la loro memorizzazione in variante. Fin qui tutto bene.

Ma quando voglio prova di lettura e scrittura di queste proprietà, ho bisogno di sapere anche il loro tipo. Per le cose che sono tipi qt già standard, posso fare questo tramite QVariant :: tipo (), ma come Ho un sacco di usertypes, come questo sarebbe compiuto?

Dal api di QVariant, ho notato questo:

bool QVariant::canConvert ( Type t ) const

Ma io sono un po 'dubbio se questo porterà a tipi sbagliati in caso di enumerazioni?

Quindi, quale sarebbe il modo infallibile per verificare che tipo di tipo utente viene memorizzato in QVariant?

È stato utile?

Soluzione

Per i tipi definiti dall'utente c'è QVariant :: Karma () . Funziona come QVariant :: tipo (), ma restituisce il tipo id integer del tipo definito dall'utente mentre QVariant :: tipo () sempre tornare QVariant :: UserType.

C'è anche QVariant :: typename () che restituisce il nome del tipo come una stringa.

EDIT:

Probabilmente dipende da come si imposta il QVariant. Direttamente utilizzando QVariant :: QVariant (tipo int, const void * copia) è scoraggiato.

Di 'Ho tre tipi in questo modo:

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

        MyFirstType(const QString &content);

        QString content() const;

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

Il terzo senza Q_DECLARE_METATYPE

I memorizzarli in 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 ottenere:

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 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top