Qt 有没有一种简单的方法可以将QVariant类与十六进制字符串一起使用?

Qt 有没有一种简单的方法可以将QVariant类与十六进制字符串一起使用?,qt,hex,qvariant,Qt,Hex,Qvariant,此代码示例的工作原理与我预期的一样: v = QVariant("123456"); qDebug() << v; // QVariant(QString, "123456") v.convert(QVariant::Int); qDebug() << v; // QVariant(int, 123456) v.convert(QVariant::String); qDebug() << v; // QVariant(QString, "123456") v

此代码示例的工作原理与我预期的一样:

v = QVariant("123456");
qDebug() << v; // QVariant(QString, "123456")
v.convert(QVariant::Int);
qDebug() << v; // QVariant(int, 123456)
v.convert(QVariant::String);
qDebug() << v; // QVariant(QString, "123456")
v=QVariant(“123456”);

qDebug()将qvariant转换为数值时,需要指定基数。还要确保该值适合int/long/longlong,否则转换将因此失败

QVariant v = QVariant("0xDEADBEAF");
bool test;
qDebug() << v.toString().toLongLong(&test,16);
qDebug() << test;

QVariant v = QVariant("0xDEADBEAF");
bool test;
qDebug() << v.toString().toInt(&test,16);
qDebug() << test;

在讨论了关于数值溢出的观点之后,我做了一些调查,似乎QVariant的转换例程有缺陷。安全转换QVariant的最简单方法是使用QString的转换。这似乎也是将QVariant与十六进制字符串一起使用的最简单方法。我在下面总结了我的发现。这些注释将是调用
qDebug()的结果输出,我已经更新了我的问题,以反映一个更合理的示例。然而,我认为你失败的理由是错误的。“0xBEEF”转换为0,而不是不会溢出的48879。话虽如此,如果您删除不正确的部分并更新以匹配修改后的问题,我将很高兴接受您的答案,因为这是一个很好的解决方案,谢谢。:)是和否。在QVariant::convert()的情况下,它首先失败,因为它不知道从哪个基进行转换。这种情况也发生在“0xBEEF”案中。但是如果您指定了基,那么它将失败,因为由于溢出,它无法将“0xDEADBEEF”转换为合法的int。因此,QVariant(“OxBEEF”).toString.toInt(&test,16)将成功,而QVariant(“OxDEADBEEF”).toString.toInt(&test,16)将不会成功。我将更新我的答案。正确,但存储为字符串的数字的QVariant转换例程会根据字符串中包含的字符进行尝试(即
“1”==1
,但不在
“m1stack”
)。我希望它能对在C++代码中存储的十六进制字符串(即<代码> > <=10 < /COD> > <代码> > 0xA >代码>而不是在<代码>“DIXXAN”<代码>中进行同样的尝试。QVariant似乎并不费心做任何这样的尝试(基于我的
“0xBEEF”
示例的结果)。我认为它只是假设它是一个以10为基数的数字,如果不是,它就会失败。QString::toInt()的默认值是10进制,我猜这就是QVariant::convert()调用的函数,而不是这样。再次感谢您回答我的问题,并让我在QVariant中找到了那个bug:)
QVariant v = QVariant("0xDEADBEAF");
bool test;
qDebug() << v.toString().toLongLong(&test,16);
qDebug() << test;
3735928495 
true 
QVariant v = QVariant("0xDEADBEAF");
bool test;
qDebug() << v.toString().toInt(&test,16);
qDebug() << test;
0
false
v = QVariant("0xBEEF"); // 'QVariant(QString, "0xBEEF") '
v = v.toString().toInt(0, 16); // 'QVariant(int, 48879) '

v = QVariant("0xDEADBEEF"); // 'QVariant(QString, "0xDEADBEEF") '
v = v.toString().toInt(0, 16); // 'QVariant(int, 0) '
v = QVariant("123456"); // 'QVariant(QString, "123456") '
v.convert(QVariant::Int); // 'QVariant(int, 123456) '
v = QVariant("2147483649"); // 'QVariant(QString, "2147483649") '
v.convert(QVariant::Int); // 'QVariant(int, -2147483647) '

v = QVariant("9223372036854775807"); // 'QVariant(QString, "9223372036854775807") '
v.convert(QVariant::Int); // 'QVariant(int, -1) '
v = QVariant("2147483649"); // 'QVariant(QString, "2147483649") '
v = v.toString().toInt(); // 'QVariant(int, 0) '

v = QVariant("9223372036854775807"); // 'QVariant(QString, "9223372036854775807") '
v = v.toString().toInt(); // 'QVariant(int, 0) '