英文:
Inconsistent conversion of QVariant to double
问题
我有困难理解 QVariant::canConvert 和 QVariant::toDouble 的行为。我本来期望,如果底层的变体数据是 QString,那么这两者都应该返回 false,但我得到了不同的结果,如下所示:
#include <QString>
#include <QVariant>
#include <QDebug>
int main(int argc, char *argv[])
{
QString not_a_number("foo");
QVariant variant(not_a_number);
auto can_convert_1 = variant.canConvert<double>();
auto can_convert_2 = false;
variant.toDouble(&can_convert_2);
qDebug() << can_convert_1 << can_convert_2; //打印: true false
}
方法 canConvert 返回 true,而 toDouble 返回 false。
请有人解释一下这个行为吗?
我在 Windows 上使用 Qt 5.15.7 和 Visual Studio 2019。
英文:
I'm having trouble understanding the behaviour of QVariant::canConvert and QVariant::toDouble. I'd expect that both of these would return false if the underlying variant data is, say, a QString, but I'm getting different results as shown:
#include <QString>
#include <QVariant>
#include <QDebug>
int main(int argc, char *argv[])
{
QString not_a_number("foo");
QVariant variant(not_a_number);
auto can_convert_1 = variant.canConvert<double>();
auto can_convert_2 = false;
variant.toDouble(&can_convert_2);
qDebug() << can_convert_1 << can_convert_2; //prints: true false
}
The method canConvert returns true whereas the toDouble return false.
Can someone explain this behaviour please?
I'm using Qt 5.15.7 on Windows with Visual Studio 2019.
答案1
得分: 1
QVariant::toDouble(bool *ok = nullptr) const 和 template <typename T> bool QVariant::canConvert() const 有两个非常不同的含义。bool* ok 会在转换成功时返回 true,而 canConvert() 则表示源类型是否能够转换为目标类型。
QString 能够转换为 double 吗?可能。
QString 是可以转换为 double 的类型之一吗?是的,所以 canConvert() 将始终返回 true,但当然 toDouble() 会失败。
事实上,如果你尝试以下代码:
auto convert = [](auto&& string){
QString not_a_number(string);
QVariant variant(not_a_number);
auto can_convert_1 = variant.canConvert<double>();
auto can_convert_2 = false;
variant.toDouble(&can_convert_2);
qDebug() << can_convert_1 << can_convert_2;
};
convert("foo");
convert("5");
将打印出:
true false
true true
两者都是 QString,所以 canConvert 成功,而 toDouble 只有对 "5" 才能成功转换为 double。
英文:
double QVariant::toDouble(bool *ok = nullptr) const
and
template <typename T> bool QVariant::canConvert() const
have two very different meanings. bool* ok will return true if the conversion has actually succeded, while canConvert() tell if the source type could be converted to the destination type.
QString can be converted to double? Maybe.
QString is one of the type allowed to be converted to double? Yes, so canConvert() will always return true, but toDouble() of course will fail.
Indeed if you try
auto convert = [](auto&& string){
QString not_a_number(string);
QVariant variant(not_a_number);
auto can_convert_1 = variant.canConvert<double>();
auto can_convert_2 = false;
variant.toDouble(&can_convert_2);
qDebug() << can_convert_1 << can_convert_2;
};
convert("foo");
convert("5");
will print
true false
true true
Both are QString, so canConvert succed, toDouble only succed for "5" can actually be converted to double.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论