QT读写配置文件之QDataStream和QSettings类

简介:在项目开发时和程序运行时我们需要保存很多数据到配置文件,不管什么开发语言都有读写配置的文件的类。这样方便了开发,节省了开发时间,提高了效率。现在来介绍我在项目中用到的QDataStream和QSettings,对比他们的有缺点,以及使用方法,下面详细介绍这两个类的使用。

第一:介绍QDataStream类的使用。

1.1、QDataStream类的所有成员函数的列表http://www.kuqin.com/qtdocument/qdatastream.html#QDataStream

1.2、实例1(向一个流中写二进制数据):
   QFile file("file.dta");                            //创建文件对象,指定保存路径
    file.open(QIODevice::WriteOnly);     //打开文件
    QDataStream sOut(&file);                // 我们将把数据串行化至文件f
    sOut << "this is MainWindow";         // 串行化一个字符串
    sOut << (int32_t)88;                         // 串行化一个整数
    file.close();             // 关闭文件

1.3、实例2(从一个流中读二进制数据):
    QFile file("file.dta");          // 创建文件对象,指定读取路径
    file.open(QIODevice::ReadOnly);
    QDataStream sIn(&file);          // 从文件f中读取串行化的数据
    QString str;
    int32_t a;
    sIn >> str >> a;                 // 提取出“this is MainWindow”和88

1.3、实例3(向一个流中写自定义结构体二进制数据):

//自定义结构体

struct Persion
{
private:
    QString sName;  //姓名
    int iAge;       //年龄
    int iHight;     //身高
    float fWeight;  //体重
    bool bSex;      //性别

public:
    Persion() {memset(this, 0, sizeof(*this));} //无参构造函数
    Persion(QString sName, int iAge, int iHight, float fWeight, bool bSex) //有参构造函数
    {
        this->sName = sName;
        this->iAge = iAge;
        this->iHight = iHight;
        this->fWeight = fWeight;
        this->bSex = bSex;
    }   
};

 QDataStream& operator<<(QDataStream &ds, const Persion &data); //重载<<运算符 写结构数据到文件

 QDataStream& operator>>(QDataStream &ds, Persion &data);//重载>>运算符 读数据到结构体

由于QDataStream类没有重载( <<)有我们的自定义的数据类型,所有要重载 <<预算符。

//重载<<运算符 写结构数据到文件
QDataStream& operator<<(QDataStream &ds, const Persion &data)
{
    ds << data.sName << data.iAge << data.iHight
       << data.fWeight << data.bSex;

    return ds;
}

//重载>>运算符 读数据到结构体
QDataStream& operator>>(QDataStream &ds, Persion &data)
{
    ds >> data.sName >> data.iAge >> data.iHight
       >> data.fWeight >> data.bSex;

    return ds;
}

//往文件写自定义结构体二进制数据

       Persion perInfo("张三", 30, 178, 80, true); //声明一个自定义结构并初始化

        QFile file("file.dta");                         // 创建文件对象,指定保存路径
        file.open(QIODevice::WriteOnly);   // 打开文件
        QDataStream sOut(&file);              // 我们将把数据串行化至文件f
        sOut << perInfo;                             // 串行化一个结构体数据到文件
        file.close();                                     // 关闭文件

1.4、实例4(从一个流读取自定义结构体二进制数据):

       Persion perInfo; //声明一个自定义结构

        QFile file("file.dta");                         // 创建文件对象,指定保存路径
        file.open(QIODevice::ReadOnly);    // 打开文件
        QDataStream sIn(&file);                  // 我们将把数据串行化至文件f
        sIn >> perInfo;                                 // 串行化一个结构体数据到文件
        file.close();                                       // 关闭文件

QDataStream使用总结:

QDataStream类提供了二进制数据到QIODevice的串行化,数据流是一个编码信息的二进制流,它与主机的操作系统、CPU或字节顺序100%的没有关系。

2、QDataStream类对QT的所有基本数据类型都重载了写运算符<<和读运算符>>。

3、如果想用QDataStream读写自定类型数据,则自己必须手动实现写运算符<<和读运算符>>

4、QDataStream类还有readBytes()和writeBytes()等接口函数可以读写文件

QDataStream的优点是提供了二进制数据到QIODevice的串行化,读写速度快效率高,缺点是不能定位修改文件数据,每次只能重新读写文件。

第二:介绍QSettings类的使用。

1.1、实例1(写数据到配置文件)

     //1 创建一个配置文件对象
        QSettings ini("test.ini", QSettings::IniFormat);

        //2 开始第一个组
        ini.beginGroup("sGroup1");

        //3 写数据到配置
        ini.setValue("name1", "张三");
        ini.setValue("age1", 30);
        ini.setValue("sex1", true);
        ini.setValue("hight1", 178.52);
        saveIni(ini);

        //4 结束第一个组
        ini.endGroup();

        //5 开始第二个组
        ini.beginGroup("sGroup2");

        //6 写数据到配置
        ini.setValue("name2", "立白");
        ini.setValue("age2", 80);
        ini.setValue("sex2", true);
        ini.setValue("hight2", 190.52);
        saveIni(ini);

        //7 结束第二个组
        ini.endGroup();

1.2、实例2(从配置文件读取数据)

       //1 创建一个配置文件对象
        QSettings ini("test.ini", QSettings::IniFormat);

        //2 开始第一个组
        ini.beginGroup("sGroup1");

        //3 从配置文件读取数据
        QString sName1 = ini.value("name").toString();
        int iAge1 = ini.value("age").toInt();
        bool bSex1 = ini.value("sex").toBool();
        float fHight1 = ini.value("hight").toFloat();

        //4 结束第一个组
        ini.endGroup();

        //5 开始第二个组
        ini.beginGroup("sGroup2");

        //6 从配置文件读取数据
        QString sName2 = ini.value("name2").toString();
        int iAge2 = ini.value("age2").toInt();
        bool bSex2 = ini.value("sex2").toBool();
        float fHight2 = ini.value("hight2").toFloat();

        //7 结束第二个组
        ini.endGroup();

QSetings使用总结:

1、写配置文件函数原形void setValue(const QString &key, const QVariant &value),setValue()的第一个参数是一个关键,第二个参数是一个万能数据类型,关键字表示待会读取时在某个组根据关键字读取数据,万能数据类型表示只要是QT的数据类型都能保存。

2、value()函数可以根据关键字读取数据,并转为用户想要的数据类型。

3、QSetings的优点是可以根据组名和关键字修改任意项的值,缺点是要查询文件所以速度慢,效率低。

工程源码地址:https://download.csdn.net/download/cwj066/10676841

猜你喜欢

转载自blog.csdn.net/cwj066/article/details/82769519