Come verificare QVariant di tipo QVariant :: UserType è tipo previsto?
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?
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