我会做一个在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中我没有找到解决方案。
由于
答案 0 :(得分:6)
要知道QVariant
是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;
}
如果您使用其他方法来获取变体的类型,您将得到错误的答案。
例如:
// 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
或字符串,但看起来足够用于您的目的。