1

此代码示例按我的预期工作:

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")
4

2 回答 2

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
于 2012-02-09T11:50:21.600 回答
1

这个答案关于数值溢出的观点之后,我做了一些调查,似乎 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)方法。

场景 2:数字存储为十进制字符串

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参数 oftoInt()来警告失败。

于 2012-02-09T14:01:31.073 回答