【问题标题】:identify if QVariant is String or Int确定 QVariant 是 String 还是 Int
【发布时间】:2017-12-21 17:50:58
【问题描述】:

我将做一个在 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 中我没有找到解决方案。

谢谢

【问题讨论】:

  • 如果你可以用QVariant::toInt()将它转换为int,那么它就是一个int,否则它是一个字符串或其他任何东西,因为你可以将任何QVariant转换为字符串。
  • 试试int QVariant::toInt(bool *ok = Q_NULLPTR) const
  • 示例:bool ok; int number =your_variant.toInt(&ok); if(ok){ qDebug()<<"is number" }
  • 您的解决方案都有效。谢谢。我之前可以想到。

标签: c++ string qt 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(var); // 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>();
}

【讨论】:

  • 不确定“canConvert”是否可靠。 IE。尝试将 "QVariant(QString, "71.62465753424658")" 转换为 int。 "canConvert" 将返回 true,而 "value()" 将返回 0。
  • @Gediminas canConvert() 只告诉您QVariant 是否知道如何在两种类型之间进行转换。它不会告诉您转换是否会顺利进行。在您的情况下,QVariant 知道如何将QString 转换为int:它将调用String::toInt(),问题是QString::toInt() 将返回0,因为71.62465753424658 不是int
【解决方案2】:

QVariant::canConvert() 是一个模板化的方法,它返回真或假,无论变体是否可以转换为特定类型。在它的帮助下:

QVariant v = 42;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2013-10-11
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多