Qt学习之使用QSetting类设置配置文件

1 引言

在做工程项目时,我们经常有些需要配置的参数,比如说串口的波特率、端口号、停止位、数据位等信息,使用QSetting类可以将一些我们需要的参数写入一个inc格式的配置文件,保存在计算机中,如果下次打开应用程序,就可以直接读取配置文件中的相关参数,另外,如果在程序运行过程中修改了配置参数,那么一定要更新配置文件中的内容。
接下来,我将设计一个简单的例子,配置文件中存储的是两个控制器的Kp、Ki、Kd参数。

2 准备工作

添加QSetting的头文件

#include <QSettings>

3 设计界面

在这里插入图片描述

4 程序内容

1.写入配置文件
我们需要在程序关闭之前将配置参数写入配置文件,重写关闭事件函数

    void closeEvent(QCloseEvent *);

在函数中,首先将编辑框中的数据提取出来,然后创建一个QSettings类变量,构造函数的参数为两个字符串,分别是配置文件的名字和应用程序的名字,我们需要储存两组数据,一组是控制器1的参数,另一组是控制器2的参数,使用beginGroup()函数可以创建一个新的组,传递的参数是组的名称,再使用QSettings::setValue()函数设置要存储的信息,称为键值对,传入的参数分别是键的名称和键值,这里的键值可以是任意类型的变量,最后使用endGroup()结束这一组,注意上述传递的参数的那些名称都是自己定义的,键值是我们要存储的数据。代码如下:

void MyDialog::closeEvent(QCloseEvent *)
{
    
    
    if(!ui->CtrlKpEdt1->text().isEmpty())
        Kp1=ui->CtrlKpEdt1->text().toDouble();
    if(!ui->CtrlKiEdt1->text().isEmpty())
        Ki1=ui->CtrlKiEdt1->text().toDouble();
    if(!ui->CtrlKdEdt1->text().isEmpty())
        Kd1=ui->CtrlKdEdt1->text().toDouble();
    if(!ui->CtrlKpEdt2->text().toDouble())
        Kp2=ui->CtrlKpEdt2->text().toDouble();
    if(!ui->CtrlKiEdt2->text().isEmpty())
        Ki2=ui->CtrlKiEdt2->text().toDouble();
    if(!ui->CtrlKdEdt2->text().isEmpty())
        Kd2=ui->CtrlKdEdt2->text().toDouble();
    QSettings setting("Control Parameter Inc","MyDialog");
    setting.beginGroup("Controller1");
    setting.setValue("Kp",Kp1);
    setting.setValue("Ki",Ki1);
    setting.setValue("Kd",Kd1);
    setting.endGroup();
    setting.beginGroup("Controller2");
    setting.setValue("Kp",Kp2);
    setting.setValue("Ki",Ki2);
    setting.setValue("Kd",Kd2);
    setting.endGroup();
}

这里我们将两个控制器的6个PID参数都存储起来。
2.读取配置文件
我们在窗口的构造函数中读取配置函数,创建QSettings变量时的构造函数参数必须和写入的一样,这样读取的才是同一个配置文件,读取流程基本一致,只是把setValue()函数换成value()函数,返回值为键值,函数传入的第一个参数是要读取的键值的名称,第二个参数的含义是,如果配置文件或键值不存在,将该参数的值返回,得到六个PID参数以后,我们使用QString::number函数将其转化为QString,最后显示在编辑框中,代码如下:

    QSettings setting("Control Parameter Inc","MyDialog");
    setting.beginGroup("Controller1");
    Kp1=setting.value("Kp",100.0).toDouble();
    Ki1=setting.value("Ki",10.0).toDouble();
    Kd1=setting.value("Kd",1.0).toDouble();
    setting.endGroup();
    setting.beginGroup("Controller2");
    Kp2=setting.value("Kp",1000.0).toDouble();
    Ki2=setting.value("Ki",1.0).toDouble();
    Kd2=setting.value("Kd",0.1).toDouble();
    setting.endGroup();
    ui->CtrlKpEdt1->setText(QString::number(Kp1,'f',2));
    ui->CtrlKiEdt1->setText(QString::number(Ki1,'f',2));
    ui->CtrlKdEdt1->setText(QString::number(Kd1,'f',2));
    ui->CtrlKpEdt2->setText(QString::number(Kp2,'f',2));
    ui->CtrlKiEdt2->setText(QString::number(Ki2,'f',2));
    ui->CtrlKdEdt2->setText(QString::number(Kd2,'f',2));

在注册表中,可以看到我们保存的配置文件:
在这里插入图片描述

5 其他说明

contains()函数可以测试给定键是否存在。
remove()函数删除与键关联的设置。
allKeys()函数获取所有键的列表。
clear()函数删除所有键。
如果不想存储在注册表中,也可以存储在.ini格式的配置文件中,此时需要将构造函数的参数修改为:

    QSettings setting("./Control Parameter.ini",QSettings::IniFormat);

创建的配置文件名称为Control Parameter.ini,存储在当前目录下,配置文件中的内容如下所示:
在这里插入图片描述
我们可以像图中这样使用记事本打开,然后在记事本中可以直接修改相关的配置参数。

猜你喜欢

转载自blog.csdn.net/weixin_42411702/article/details/123510939