在实际项目中,经常会遇到需要存储或者读取配置文件的问题。例如,依靠配置的某个值,你可以打开或者关闭某个功能或者界面显示,这是非常方便的,能让你只需要维护一套代码、几个配置文件,就可以提供不同的项目给不同的客户类型使用。
配置的值你可以放在注册表中,但是注册表有一个问题就是:如果你无法读写或者被清除,就会导致项目显示有问题。所以常用的办法就是写入配置文件。QT提供了QSettings类来读写ini文件,即常见的配置文件。
ini文件的定义可以百度查询,它就是一个Windows原来采用的系统配置文件,在目前几乎所有的Windows系统上都支持。主要是包含节、键、值三个,如下:
[Name]
Value=sunatmine
[Block]
SubjectList=Chinese, Maths, English
[Age]
Value=25
[节]
键=值
其中Name、Block、Age就是节名字,它们下面的键的名字可以相同或者不同;Value、SubjectList是键的名字,=后面的就是值。节、键的名字可以随便取,但是注意节的名字不能重复,同一个节下的键的名字不能重复,否则只能读取到最开始的值。
下面我们看下ini文件的读、写。QT采用的是QSettings类(其他语言各有各的方式,ini配置文件是一个普适,即使在Linux系统中也可以使用,我接触的PHP语言做网站就支持在Linux系统使用ini配置文件)。
首先让我们创建一个ini文件:
1.新建一个txt文件,重命名option,修改扩展名为ini。(如果你看不到扩展名,请把如下“文件扩展名”勾选上)
创建好如图所示:
2.点击打开,写入信息
[IsInside]
Name=ENABLED
接着我们就可以在QT中修改或者读取它了。例如:
我有一个项目,即想给公司内部人员用,又想给外部人员用。内部人员要求他输入工号,外部人员要求他输入用户名,但是我又不想每次发新版本都编译两次项目。就可以使用ini配置文件的方式:
初始是这样的:
内部员工只想显示工号和密码,外部员工只想显示用户名和密码。那么配置文件中写:
[IsInside]
Name=ENABLED
当值为ENABLED时,说明是内部版本;如果值不是ENABLED或者读取不到值,说明是外部版本。代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QSettings"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//读取配置文件
QSettings settings("D:\\software\\option.ini",QSettings::IniFormat);
settings.beginGroup("IsInside");
QString value = settings.value("Name").toString();
settings.endGroup();
if(value == "ENABLED")
{
inside();
}
else
{
outside();
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::inside()
{//内部版本:用户名不显示 工号显示
ui->label->setVisible(false);
ui->lineEdit->setVisible(false);
ui->lineEdit->setText("");
ui->label_3->setVisible(true);
ui->lineEdit_3->setVisible(true);
ui->lineEdit_3->setText("");
}
void MainWindow::outside()
{//外部版本:用户名显示 工号不显示
ui->label->setVisible(true);
ui->lineEdit->setVisible(true);
ui->lineEdit->setText("");
ui->label_3->setVisible(false);
ui->lineEdit_3->setVisible(false);
ui->lineEdit_3->setText("");
}
根据配置文件显示如下:
这样你就可以不用维护两套代码了,并且工程只需要编译一次,根据配置文件的不同,可以变成任意你需要的版本。
QSettings不仅可以读取QString类型,还可以读取为各种类型、甚至list列表,具体的可以根据实际需求来操作:
QString value = settings.value("Name").toString();//QString
int value1 = settings.value("Name").toInt();//int
QStringList value2 = settings.value("Name").toStringList();//list
bool value3 = settings.value("Name").toBool();//bool
写入配置文件也很简单的:
//写入配置文件
QSettings settings1("D:\\software\\option.ini",QSettings::IniFormat);
settings.beginGroup("Info");
settings.setValue("Name","sunatmine");
settings.setValue("Age",40);
settings.endGroup();
settings.sync();
结果如下: