英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论