我想使用Qt框架持久存储一个整数对列表。
我想使用QList< QPair < int,int>>
作为列表的类型,并使用QSettings
将它们存储在.ini
文件中。
不幸的是,函数QSettings::setValue
引发错误:
no matching function for call to ‘QSettings::setValue(const char [19], FavoriteList&)’
note: no known conversion for argument 2 from QList< QPair< int, int> > to ‘const QVariant&’
字符串
似乎它不能将该类型强制转换为QVariant
。我尝试用Q_DECLARE_METATYPE
声明它,但它不起作用,它引发了同样的错误。
失败的代码示例:
QList<QPair<int,int>> list;
if(!settings.contains("Radio/Favorites/FM"))
{
settings.setValue("Radio/Favorites/FM", list);
}
型
如何将该类型写入QSettings
对象?
2条答案
按热度按时间vktxenjb1#
你根本没有任何兼容的隐式转换,编译器不知道如何将你的列表转换为变量。
事实上,
Q_DECLARE_METATYPE
根本不应该是必需的,至少对我来说,下面的代码编译没有错误:字符串
编辑:虽然它不会得到编译错误,但它仍然会得到一个运行时错误,因为它不知道如何序列化和非序列化一个int对列表。所以你必须告诉它如何:
型
并在Meta系统中为类型注册流操作符:
型
Aaand..它工作!
型
nsc4cvqm2#
标签:http://doc.qt.io/qt-5/qvariant.html
您可以在QVariant中存储的唯一类型的QList是
QList<QVariant>
,即变体可以是变体的列表。所以你需要用
QList<QVariant>
替换QList<QPair<int, int>>
,作为列表中的变量,你可以存储qulonglong
,它是一个64位整数,你可以把你的两个32位整数打包到它里面,或者想出一些其他的方案(包括一个列表列表,其中每个子列表的长度为2,并存储为QVariant)。作为替代方案,使用
QList<QJsonDocument>
,并简单地将所有设置存储为JSON。