为什么qvariant::fromvalue<qreal>(0.0108)的返回值变成0.0了
时间: 2023-12-10 16:40:27 浏览: 30
`qvariant::fromvalue` 函数用于将一个值转换为 QVariant 类型,其中 `<qreal>` 表示转换为浮点数类型。但是,当转换的值小于 `std::numeric_limits<qreal>::epsilon()` 的值时,会被认为是零,因此你传入的值 `0.0108` 小于这个极小值,所以被认为是零,返回值就是 0.0。
如果你想保留小数位数,可以将值转换为字符串,然后再转换为 QVariant 类型,例如:
```
QVariant value(QString::number(0.0108, 'f', 4)); // 转换为保留四位小数的字符串
qreal number = value.toReal(); // 转换为浮点数类型
```
相关问题
要将QList<MyType>数据保存到QSettings中,可以使用QVariantList作为中介: 复制 QSettings settings("Organization", "Application"); QList<MyType> myList; // 添加数据到myList中 QVariantList variantList; for (const MyType& item : myList) { variantList << QVariant::fromValue(item); } // 保存数据到QSettings settings.setValue("MyList", variantList); 要获取保存的QList<MyType>数据,可以使用如下代码: 复制 QSettings settings("Organization", "Application"); QVariantList variantList = settings.value("MyList").toList(); QList<MyType> myList; // 转换为QList<MyType> for (const QVariant& v : variantList) { MyType item = v.value<MyType>(); myList << item; } 需要注意的是,如果自定义类MyType没有默认构造函数,那么在使用QVariant::fromValue时可能会出现编译错误。此时可以在自定义类中添加一个默认构造函数,或者使用QVariant::setValue和QVariant::value函数来保存和读取数据。这是使用的代码,执行后程序崩溃,报错:要将QList<MyType>数据保存到QSettings中,可以使用QVariantList作为中介: 复制 QSettings settings("Organization", "Application"); QList<MyType> myList; // 添加数据到myList中 QVariantList variantList; for (const MyType& item : myList) { variantList << QVariant::fromValue(item); } // 保存数据到QSettings settings.setValue("MyList", variantList); 要获取保存的QList<MyType>数据,可以使用如下代码: 复制 QSettings settings("Organization", "Application"); QVariantList variantList = settings.value("MyList").toList(); QList<MyType> myList; // 转换为QList<MyType> for (const QVariant& v : variantList) { MyType item = v.value<MyType>(); myList << item; } 需要注意的是,如果自定义类MyType没有默认构造函数,那么在使用QVariant::fromValue时可能会出现编译错误。此时可以在自定义类中添加一个默认构造函数,或者使用QVariant::setValue和QVariant::value函数来保存和读取数据。
根据你提供的代码,可能的原因是自定义类MyType没有默认构造函数,导致QVariant::fromValue无法正常工作。你可以尝试在自定义类中添加一个默认构造函数来解决这个问题,例如:
```
class MyType {
public:
MyType() {}
MyType(int value1, const QString& value2) : m_value1(value1), m_value2(value2) {}
int value1() const { return m_value1; }
QString value2() const { return m_value2; }
private:
int m_value1;
QString m_value2;
};
```
如果你不能修改自定义类的定义,你可以考虑使用QVariant::setValue和QVariant::value函数来保存和读取数据,例如:
```
QVariantList variantList;
for (const MyType& item : myList) {
QVariant variant;
variant.setValue(item);
variantList << variant;
}
...
for (const QVariant& v : variantList) {
MyType item;
v.value(&item);
myList << item;
}
```
这样可以避免使用默认构造函数。希望这可以解决你的问题。
报错“QVariant::QVariant<QtProperty*,false>(T)”: 尝试引用已删除的函数
这个错误通常是因为你在尝试复制或拷贝一个不支持的类型,或者该类型的构造函数被删除了。在这个特定的错误中,错误信息中提到了 `QVariant::QVariant<QtProperty*,false>(T)`,这意味着你正在尝试将一个 `QtProperty*` 类型的指针转换为 `QVariant` 类型,但是 `QVariant` 并没有一个接受 `QtProperty*` 参数的构造函数。
为了解决这个问题,你需要明确 `QVariant` 支持的类型,然后使用正确的构造函数或转换函数来将指针转换为 `QVariant` 类型。在这个特定的情况下,你可以使用 `QVariant::fromValue()` 函数将 `QtProperty*` 指针转换为 `QVariant` 类型,例如:
```cpp
QtProperty *colProp = colMan->addProperty(QString::fromStdString(propContent->name));
QVariant colVar = QVariant::fromValue(colProp);
```
这将创建一个 `QVariant` 对象,其中包含指向 `colProp` 的指针。你可以使用 `qvariant_cast` 函数将其还原为 `QtProperty*` 指针,例如:
```cpp
QtProperty *colProp = qvariant_cast<QtProperty*>(colVar);
if (!colProp) {
// 转换失败
return;
}
```
这种方式可以避免使用模板构造函数,从而避免可能出现的问题。