识别QVariant是String还是Int

Mr.*_*per 3 c++ string int qt

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

我的变量: QVariant dataToWrite

存在一个返回dataToWrite内容的方法是String还是Integer?在c#中我做了这个解决方案:如何识别字符串是否为数字?

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

谢谢

Ben*_*n T 6

要知道a QVariant是a QString还是整数,你必须使用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;
}
Run Code Online (Sandbox Code Playgroud)

如果您使用其他方法来获取变体的类型,您将得到错误的答案.

例如:

// 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 !!!
Run Code Online (Sandbox Code Playgroud)

现在,如果你想知道a是否QVariant可以转换为整数,你可以在Qt 文档中找到答案的开头:

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

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

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


bip*_*pll 4

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

QVariant v = 42;

v.canConvert<int>();              // returns true
v.canConvert<QString>();          // returns true
Run Code Online (Sandbox Code Playgroud)

因此,它不会检查构造参数是否完全是一个int或一个字符串,但看起来足以满足您的目的。