识别QVariant是String还是Int

时间:2017-07-17 09:06:39

标签: c++ string qt int

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

我的变量: QVariant dataToWrite

是否存在返回dataToWrite内容为String或Integer的方法? 在c#中我做了这个解决方案:How do I identify if a string is a number?

我在此链接上看到了文档:http://doc.qt.io/qt-5/qvariant.html 但在qt中我没有找到解决方案。

由于

2 个答案:

答案 0 :(得分:6)

要知道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中找到答案的开头:

  

如果变体具有userType(),则将变量作为int返回   QMetaType :: Int,QMetaType :: Bool,QMetaType :: QByteArray,   QMetaType :: QChar,QMetaType :: Double,QMetaType :: LongLong,   QMetaType :: QString,QMetaType :: UInt或QMetaType :: ULongLong;   否则返回0。

这意味着有许多非整数变体可以转换为整数。最安全的方法是使用QVariant::canConvert()QVariant::value()

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

答案 1 :(得分:3)

QVariant::canConvert()是一个模板化方法,返回true或false,无论变量是否可以转换为特定类型。从它的帮助:

QVariant v = 42;

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

因此,它不会检查构造参数是否恰好是int或字符串,但看起来足够用于您的目的。