根据你提供的代码,可能的原因是自定义类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; } 这样可以避免使用默认构造函数。希望这可以解决你的问题。这个回答中,我的自定义类型是struct,不是class,应该如何处理
时间: 2024-03-16 16:44:24 浏览: 50
对于自定义类型为struct的情况,你可以将上面提供的class的方式稍作修改,将所有的public成员变量都改为public属性,并添加一个默认构造函数,代码示例如下:
```
struct MyType {
int value1;
QString value2;
MyType() {}
MyType(int value1, const QString& value2) : value1(value1), value2(value2) {}
};
```
这样就可以正常使用QVariant::fromValue了。如果你仍然无法修改struct的定义,你可以考虑使用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函数来保存和读取数据。这是使用的代码,执行后程序崩溃,报错:要将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;
}
```
这样可以避免使用默认构造函数。希望这可以解决你的问题。
QVector包含自定义类型 转QVariant,在QVariant中加时间戳
可以通过继承 QVariant 类来实现自定义类型的转换并添加时间戳。
首先,你需要创建一个类来存储你的自定义类型和时间戳。这个类可以包含两个成员变量:一个是你的自定义类型,另一个是一个 QDateTime 对象,用于存储时间戳。
```cpp
class TimestampedData {
public:
TimestampedData() {}
TimestampedData(const MyType& data)
: m_data(data)
, m_timestamp(QDateTime::currentDateTime())
{}
MyType data() const { return m_data; }
QDateTime timestamp() const { return m_timestamp; }
private:
MyType m_data;
QDateTime m_timestamp;
};
```
接下来,你需要创建一个 QVariant 类的子类来实现 TimestampedData 的转换。在这个子类中,你需要重写 QVariant::canConvert() 和 QVariant::toByteArray() 方法。
```cpp
class TimestampedDataVariant : public QVariant
{
public:
TimestampedDataVariant(const TimestampedData& data)
: QVariant(QVariant::UserType)
, m_data(data)
{}
static QVariant fromTimestampedData(const TimestampedData& data)
{
return QVariant::fromValue(TimestampedDataVariant(data));
}
static TimestampedData toTimestampedData(const QVariant& variant)
{
return variant.value<TimestampedDataVariant>().data();
}
bool canConvert(QVariant::Type type) const override
{
return type == QVariant::ByteArray || type == qMetaTypeId<TimestampedData>();
}
QByteArray toByteArray() const override
{
QDataStream stream;
stream << m_data.data() << m_data.timestamp();
return stream.device()->buffer();
}
private:
TimestampedData m_data;
};
```
现在,你可以将 TimestampedData 转换为 QVariant。
```cpp
TimestampedData data = ...;
QVariant variant = TimestampedDataVariant::fromTimestampedData(data);
```
你也可以将 QVariant 转换为 TimestampedData。
```cpp
QVariant variant = ...;
TimestampedData data = TimestampedDataVariant::toTimestampedData(variant);
```
注意,如果你想在 QVariant 中添加时间戳,你需要在 TimestampedData 的构造函数中添加代码来初始化时间戳。
阅读全文