2017-07-17 6 views
0

Je vais faire une méthode qui écrit des données sur Modbus. J'ai besoin de ce retour QVariant si c'est String ou Int.identifier si QVariant est String ou Int

var .: Mon QVariant dataToWrite

Exist une méthode retour dataToWrite contenu est une chaîne ou entier? En C# j'ai fait comment cette solution: How do I identify if a string is a number?

J'ai vu la documentation sur ce lien: http://doc.qt.io/qt-5/qvariant.html Mais qt je ne trouve pas de solutions.

Merci

+0

Si vous pouvez jeter int avec 'QVariant :: toInt()', que c'est un entier, sinon il est une chaîne ou anythings d'autre, parce que vous pouvez convertir n'importe quel QVariant en chaîne de toute façon. – vahancho

+2

Essayez avec 'int QVariant :: toInt (bool * ok = Q_NULLPTR) const' – eyllanesc

+0

Exemple:' bool ok; int nombre = your_variant.toInt (&ok); si (ok) {qDebug() << "est le numéro"} ' – eyllanesc

Répondre

1

QVariant::canConvert() est une méthode qui renvoie basé sur un modèle vrai ou faux, que la variante peut être convertie en un type particulier. De son aide:

QVariant v = 42; 

v.canConvert<int>();    // returns true 
v.canConvert<QString>();   // returns true 

ne pas vérifier donc il si l'argument de la construction était exactement un int ou une chaîne semble encore suffisant pour vos besoins.

1

Pour savoir si un QVariant est un QString ou un entier, vous devez utiliser QVariant::type() ou QVariant::userType().

bool isInteger(const QVariant &variant) 
{ 
    switch (variant.userType()) 
    { 
     case QMetaType::Int: 
     case QMetaType::UInt: 
     case QMetaType::LongLong: 
     case QMetaType::ULongLong: 
      return true; 
    } 
    return false; 
} 

bool isString(const QVariant &variant) 
{ 
    return variant.userType() == QMetaType::QString; 
} 

Si vous utilisez d'autres méthodes pour obtenir le type de la variante, vous obtiendrez des réponses erronées.

Par exemple:

// This function does not work! 
bool isInteger(const QVariant &variant) 
{ 
    bool ok = false; 
    variant.toInt(&ok); 
    return ok; 
} 

QString aString = "42"; 
QVariant var = aString; 
isInteger(aString); // Returns true, but var.type() returns QMetaType::QString !!! 

Maintenant, si vous voulez savoir si un QVariant peut être converti en un entier, vous avez le début d'une réponse dans Qt Documentation:

Renvoie la variante comme un int si la variante a userType() QMetaType :: Int, QMetaType :: Bool, QMetaType :: QByteArray, QMetaType :: QChar, QMetaType :: Double, QMetaType :: LongLong, QMetaType :: QString, QMetaType: : UIn t, ou QMetaType :: ULongLong; sinon renvoie 0.

Cela signifie qu'il existe de nombreuses variantes non entières pouvant être converties en nombre entier. La meilleure façon de le faire est d'utiliser QVariant::canConvert() et QVariant::value():

QString aString = "42"; 
QVariant var = aString; 
if (var.canConvert<int>()) 
{ 
    auto anInteger = var.value<int>(); 
}