2017-07-17 77 views
0

我会做一个在modbus上写数据的方法。 如果是String或Int,我需要该QVariant返回。确定如果QVariant是String或Int

我的变种: 的QVariant dataToWrite

存在返回dataToWrite内容是字符串或整数的方法? 在C#我怎么这个解决方案:How do I identify if a string is a number?

我看到这个链接的文档:http://doc.qt.io/qt-5/qvariant.html 但是在QT我没有找到解决方案。

由于

+0

如果你能投它与'的QVariant :: toInt()'为int,比它的一个int,否则它是一个字符串或者anythings,因为你可以将任何QVariant转换为字符串。 – vahancho

+2

尝试'int QVariant :: toInt(bool * ok = Q_NULLPTR)const' – eyllanesc

+0

示例:'bool ok; int number = your_variant.toInt(&ok); if(ok){qDebug()<<“is number”}' – eyllanesc

回答

1

QVariant::canConvert()是返回真或假,该变体是否可以转换到特定类型的模板的方法。从它的帮助:

QVariant v = 42; 

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

所以它不是没有检查施工参数正好是一个int或字符串但看起来足以满足您的目的。

1

要知道QVariantQString还是整数,您必须使用QVariant::type()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; 
} 

如果使用其他方法来获得变异的类型,你会得到错误的答案。

例如:

// 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 !!! 

现在,如果你想知道一个QVariant可以转换为整数,你有一个答案的Qt中Documentation开头:

返回变种作为int,如果变体具有userType() QMetaType :: Int,QMetaType :: Bool,QMetaType :: QByteArray, QMetaType :: QChar,QMetaType :: Double,QMetaType :: LongLong, QMetaType :: QString,QMetaType: :UIN t或QMetaType :: ULongLong; 否则返回0.

这意味着有很多非整数变量可以转换为整数。要做到这一点,最安全的方法是使用QVariant::canConvert()QVariant::value()

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