此代码示例正如我所料:
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("0xBEEF");
qDebug() << v; // QVariant(QString, "0xBEEF")
v.convert(QVariant::Int);
qDebug() << v; // QVariant(int, 0)
v.convert(QVariant::String);
qDebug() << v; // QVariant(QString, "")
有没有简单的方法可以让QVariant类使用十六进制字符串,所以第二个例子可以这样工作:
v = QVariant("0xBEEF");
qDebug() << v; // QVariant(QString, "0xBEEF")
v.convert(QVariant::Int);
qDebug() << v; // QVariant(int, 48879)
v.convert(QVariant::String);
qDebug() << v; // QVariant(QString, "48879")
答案 0 :(得分:2)
将qvariant转换为数值时,需要指定基数。还要确保该值适合int / long / longlong,否则转换将因此失败。
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
答案 1 :(得分:1)
在this answer关于数字溢出的观点之后,我做了一些调查,看起来QVariant的转换例程存在缺陷。安全转换QVariant的最简单方法是使用QString的转换。这似乎也是使用十六进制字符串的QVariant的最简单方法。我在下面总结了我的发现。评论将是在代码中该点调用qDebug() << v;
的结果输出。
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) '
将字符串表示一个十进制数字转换为数字类型的最简单,最安全的方法是使用QString的toInt(bool * ok = 0, int base = 10)
方法。
v = QVariant("123456"); // 'QVariant(QString, "123456") '
v.convert(QVariant::Int); // 'QVariant(int, 123456) '
QVariant的convert(Type t)
方法在这种情况下可以正常工作。
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) '
但是,当字符串包含对于数据类型而言过大的数字时,使用相同的方法会导致静默溢出,而不是执行更有用的操作,例如返回false并将QVariant设置为0。
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) '
通过使用与场景1中相同的方法,可以防止这种情况发生,并使用*bool
的可选toInt()
参数来提醒失败。