Qt:QMap数据到本地文件,使数据持久化 (***)

目录

Qt:QMap数据到本地文件,使数据持久化 (**直接采用 流 方式存到文件)

Qt中如何将一个QMap对象转换成QList或者QString对象

--------------------------------------------------------------------

要点:

QSettings 不能正确读写 Linux的 *.esktop文件;

使用 QMap就可以了?

参考:

base64:64进制计数系统,和 二、十进制计数系统,是类似的概念。

QTextStream 类(文本流)和 QDataStream 类(数据流)  https://blog.csdn.net/ken2232/article/details/132006250

=======================================

Qt:QMap数据到本地文件,使数据持久化 (**直接采用 文本流 方式存到文件)

    1. 写数据到本地文件

        //写数据到本地文件
        QMap<QString,QString> mapData;
        mapData.insert("Baidu","www.baidu.com");
        mapData.insert("Apple","www.apple.com");
        QMapIterator<QString, QString> i(mapData);
     
        QFile file("data.log");
        file.open(QIODevice::WriteOnly | QIODevice::Append);
        QTextStream out(&file);
     
        while ( i.hasNext())
        {
            i.next();  //首次运行,指向第一个最开始的位置?
            out<<i.key()<<",";
            out<<i.value()<<"\n";
        }
     
        file.close();

数据用逗号隔开,并且一行表示一个key-value

    2.读取数据

        QString key, value;
        file.open(QIODevice::ReadOnly);
        QTextStream in(&file);  //用文件构造流
        QString line = in.readLine(); //读取一行放到字符串里
     
        QStringList strList = line.split(",");
        if(strList.count() == 2)
        {
            key = strList.value(0);
            value = strList.value(1);
            qDebug()<<key<<","<<value;
        }
     
        while(!line.isNull()) //字符串有内容
        {
            line=in.readLine(); //循环读取下行
            strList = line.split(",");
            if(strList.count() == 2)
            {
                key = strList.value(0);
                value = strList.value(1);
                qDebug()<<key<<","<<value;
            }
     
        }
     
        file.close();

————————————————
版权声明:本文为CSDN博主「Mr.codeee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wzz953200463/article/details/109228789

Qt中如何将一个QMap对象转换成QList或者QString对象

QMap和QList不是一个数据结构,QMap是红黑树,QList是链表,

你要转换的话,只能把 QMap的健值转换为 QList,或者把 QMap的内容值转换为QList 。

QMpa中

QList<Key> keys() const  // 函数把QMap的键值转换为QList。

QList<T> values() const  //函数把QMap的内容值转换为QList

你想转换为QString类对象,我想你应该改是想把QMap的键值提取出来,那你可以

QList<QString> keys = testMap.keys();

之后转换为一个QString可以这样:

    QStringList strList(keys );
    QString str= strList.join("");

  https://bbs.csdn.net/topics/392020092

QSettings如何將QMap <QString,int>保存到配置文件

在阅读Save QList<int> to QSettings后,我正在与QMap<QString,int>一起做同样的事情。我想配置文件看起来像这样:QSettings如何将QMap <QString,int>保存到配置文件中

1111=1 
2222=3 
4444=0 

但我发现了一个编译错误:

Q_DECLARE_METATYPE(QMap<QString,int>) 

Warning C4002: too many actual parameters for macro 'Q_DECLARE_METATYPE' 
ConfigSettings.h(5) : error C2976: 'QMap' : too few template arguments 

来源2011-07-31 user63898

A

回答

13

你得到该错误消息是由以下事实引起的预处理程序没有按不了解模板。所以它解析的是这个宏调用是否有两个参数 - QMap<QStringint>,这是没有意义的。

要保存所需数据,最好自己将其序列化为 QSettings。事情是这样写:

settings.beginGroup("Whatever"); 
QMap<QString, int>::const_iterator i = map.constBegin(); 
while (i != map.constEnd()) { 
    settings.setValue(i.key(), i.value()); 
    ++i; 
} 
settings.endGroup(); 

要读取的设置,使用同样的方法与childKeys()功能的帮助。

settings.beginGroup("Whatever"); 
QStringList keys = settings.childKeys(); 
foreach (QString key, keys) { 
    map[key] = settings.value(key).toInt(); 
} 
settings.endGroup(); 

来源

2011-07-31 09:26:14 Mat

4

就像Mat所说的,错误是由预处理器不理解模板造成的。但是,您可以通过简单的typedef轻松修复此问题。

typedef QMap<QString,int> QIntMap 
Q_DECLARE_METATYPE(QIntMap) 

来源

2013-04-24 09:55:00 Aditya

+0

这似乎是更普遍的情况下,一个更好的答案,虽然我明白了为什么选择答案被选为QSettings的具体情况。 –

0

我明白接受的答案,但我认为最初的问题是如何存储QMap。它转移到如何使编译器行为。

QSettings mySettings... 
QMapIterator it(myMap); 
// iterate through the map to save the values in your chosen format 
while(it.hasNext()) 
{ 
    it.next(); 
    mySettings.setValue(it.key(), it.value()); 
} 

然而,如果你想保存这和一帮其他的设置或数据结构一起,你可以考虑使用“请将BeginGroup()”和“端基()”进行分组一堆不同的数据结构为一个文件。非常整洁和可读。

来源

2017-03-27 12:47:14 guitarpicva

+0

尽管我们感谢您的回答,但如果它提供了其他答案的附加值,那将会更好。在这种情况下,您的答案不会提供额外的价值,因为另一个用户已经发布了该解决方案。如果以前的答案对你有帮助,你应该投票,而不是重复相同的信息。 –

1

QSetting接受QVariant类型传递到setValue方法,所以这意味着你可以直接存储QMap<QString, QVarint>地图设置

// Store 
QMap<QString, QVariant> storeMap; 
QMapIterator it(myMap); 
// iterate through the map to save the values in your chosen format 
while(it.hasNext()) 
{ 
    storeMap[it.key()] = QVariant(it.value()); 
    it.next(); 
} 
settings.setValue("myKey", storeMap); 

.. 
// Read 
QMap<QString, QVariant> readMap = settings.value("myKey").toMap(); 
QMapIterator it(readMap); 
while(it.hasNext()) 
{ 
    myMap[it.key()] = it.value().toInt(); 
    it.next(); 
} 

来源

2017-03-30 13:18:24

相关问题

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值