c++ - 确定 QVariant 是 String 还是 Int

标签 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中我没有找到解决方案。

谢谢

最佳答案

要知道 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(var); // Returns true, but var.type() returns QMetaType::QString !!!

现在,如果您想知道 QVariant 是否可以转换为整数,您可以在 Qt 中找到答案 Documentation :

Returns the variant as an int if the variant has userType() QMetaType::Int, QMetaType::Bool, QMetaType::QByteArray, QMetaType::QChar, QMetaType::Double, QMetaType::LongLong, QMetaType::QString, QMetaType::UInt, or QMetaType::ULongLong; otherwise returns 0.

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

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

关于c++ - 确定 QVariant 是 String 还是 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45140049/

相关文章:

c - 读取 FILE 时 sscanf 中的段错误

c++ - 在堆栈上分配对齐的内存,如 _alloca

c++ - C++ 中的 Glob 并打印结果

javascript - 在javascript中连接正则表达式时重复

c++ - Q_ASSERT 发布构建语义

c++ - 最少的 openGL 初始化

c++ - 使用 qt + qprinter 将工作 url 添加到 pdf

用于使用 Horner 方法进行多项式计算的 C++ constexpr

c++ - C++ 中范围的状态是什么?

c# - 检查 List<List<string>> 是否包含字符串