识别QVariant是字符串还是整数

11

我将编写一个在 modbus 上写入数据的方法。

我需要让 QVariant 返回它是字符串还是整数。

我的变量: QVariant dataToWrite

是否存在一种方法可以返回 dataToWrite 的内容是字符串或整数?在 C# 中,我采用了以下解决方案:如何判断一个字符串是否为数字?

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

谢谢


如果你可以使用QVariant::toInt()将其转换为int类型,那么它就是一个int类型,否则它就是一个字符串或其他任何类型,因为你总是可以将任何QVariant转换为字符串。 - vahancho
2
尝试使用int QVariant::toInt(bool *ok = Q_NULLPTR) const - eyllanesc
bool ok; int number = your_variant.toInt(&ok); if(ok){ qDebug() << "是数字" } - eyllanesc
你的解决方案都有效。谢谢。 我以前就能想到它。 - Mr. Developer
2个回答

16

要知道一个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 的 文档中找到答案:

如果变体的 userType() 为 QMetaType::Int、QMetaType::Bool、QMetaType::QByteArray、QMetaType::QChar、QMetaType::Double、QMetaType::LongLong、QMetaType::QString、QMetaType::UInt 或 QMetaType::ULongLong,则返回 int 类型的变量;否则返回 0。

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

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

不确定“canConvert”是否可靠。例如,尝试将“QVariant(QString,“71.62465753424658”)”转换为int。 “canConvert”将返回true,“value<int>()”将返回0。 - Gediminas
1
@Gediminas canConvert() 只告诉你 QVariant 是否知道如何在两种类型之间进行转换。它并不告诉你转换是否会成功。在你的情况下,QVariant 知道如何将 QString 转换成 int:它会调用 String::toInt(),但问题在于 QString::toInt() 会返回 0,因为 71.62465753424658 不是一个 int - Benjamin T

4

QVariant::canConvert() 是一个模板方法,它返回 true 或 false,判断变量能否转换为特定类型。根据其帮助文档:

QVariant v = 42;

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

因此,它并未检查构造参数是否确切地为int或字符串,但对于您的目的来说似乎足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接