在QT开发过程中,常常会使用配置文件(.ini)写入关键信息,配置文件的读写也很简单。
开发环境:vs2017 + qt5.9.8
其文件格式一般为
[section] // 节名
key = value //键 = 值
key2 = value2 //键 = 值
1.配置文件的读过程
通过配置文件读入两张图片,做一个简单的点击按钮切换背景图片的示例
读取文件的代码在下方代码块里,可以直接下拉看关键代码
-
首先在资源文件中添加两张背景图片
-
写好一个配置文件,名称为configIO.ini,其中包含两个"节",两个节下面的键值包括图片的路径和需要的图片宽度。
-
读取配置文件代码如下。在读取配置文件之前应先判断该文件是否存在。
void ConfigIO::LoadIni(QString loadName) //loadName字符串是 配置文件里的“节”名称
{
//判断文件是否存在
QFileInfo fileInfo("configIO.ini");
if (!fileInfo.isFile())
{
QMessageBox::critical(NULL, QString::fromLocal8Bit("错误"),
QString::fromLocal8Bit("缺少configIO.ini文件!"));
return;
}
//读取配置文件
QSettings settings("configIO.ini", QSettings::IniFormat);
settings.setIniCodec("utf-8");// 解决乱码
//使用 settings.value(“节名/键名”)方法访问配置文件的值
QString ver = QString("%1/Image").arg(loadName);
QString val = settings.value(ver).toString();//配置文件读取后,要对其进行类型转换
QPixmap img(val);
ver = QString("%1/width").arg(loadName);
int wid = settings.value(ver).toInt();//配置文件读取后,要对其进行类型转换
img = img.scaledToWidth(wid, Qt::SmoothTransformation); //图片自适应宽度
//图片路径和宽度读取以后,将label的图片、大小更改为img
backgroundLabel->setPixmap(img);
backgroundLabel->setFixedSize(img.size());
}
2.配置文件的写过程
void ConfigIO::setIni()
{
//如果没有这个配置文件,会自动创建
QSettings settings("configIO.ini", QSettings::IniFormat);
settings.setIniCodec("utf-8");// 解决乱码
//使用 settings.setValue(“节名/键名”,“值”)方法 输出
QString ver = QString("user/name");
QString val = settings.value(ver).toString();
if (val.isEmpty()) { //如果没有用户名就写入
//写入数据
settings.setValue("/user/name", "admin");
settings.setValue("/password/mypass", "123456");
}
//写入数据
settings.setValue("/test/name", "admin");
settings.setValue("/test/mypass", QString::fromLocal8Bit("密码"));//QString::fromLocal8Bit() 解决乱码
/* 在user的组别下 继续写东西 */
settings.beginGroup("user");
settings.setValue("login",1);
settings.endGroup(); //关闭分组定位,注意如果需切换分组,必须保证关闭。不然切换无效
}
写完后的文件如下
完整代码如下
.h
//.h
#pragma once
#include <QtWidgets>
/**
功能:切换背景图片
*/
class ConfigIO : public QWidget
{
Q_OBJECT
signals:
void quit();
public:
ConfigIO(QWidget *parent = Q_NULLPTR);
QLabel* backgroundLabel; //背景图片
QPushButton* changeBgBtn; //切换图片按钮
QPushButton* closeBtn; //关闭按钮
int flag; //记录当前的图片是第几张
private:
void initWindow(); //初始化页面
void LoadIni(QString loadName); //读ini配置文件
void setIni(); //写ini配置文件
public slots:
void btnClick(); //切换按钮的槽函数
};
.cpp
//.cpp
#include "ConfigIO.h"
ConfigIO::ConfigIO(QWidget *parent)
: QWidget(parent)
{
//this->setGeometry(0,0,1920,1080);
initWindow();
setIni();
LoadIni("picture1");
flag = 0;
}
void ConfigIO::initWindow()
{
QDesktopWidget* pDesktop = QApplication::desktop();
QRect nScreen = pDesktop->screenGeometry(); /*获取可用桌面大小,不包括任务栏,QRect(0,0 1440x860)*/
this->setFixedSize(nScreen.width(), nScreen.height()); //设置这个窗口部件的最小大小和最大大小,这样就可以防止它变大或者变小。
this->move(0, 0);
this->setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框,不可拖动拖拽拉伸
backgroundLabel = new QLabel(this);
changeBgBtn = new QPushButton(this);
changeBgBtn->setText(QString::fromLocal8Bit("切换图片"));
changeBgBtn->setGeometry(20, 20, 100, 100);
QObject::connect(changeBgBtn, SIGNAL(clicked()), this, SLOT(btnClick()));
closeBtn = new QPushButton(this);
closeBtn->setText(QString::fromLocal8Bit("关闭"));
closeBtn->setGeometry(200, 20, 100, 100);
QObject::connect(closeBtn, SIGNAL(clicked()), this, SIGNAL(quit()));
}
void ConfigIO::setIni()
{
QSettings settings("configIO.ini", QSettings::IniFormat);
settings.setIniCodec("utf-8");// 解决乱码
//settings.setIniCodec(QTextCodec::codecForName("utf-8")); //在此添加设置,即可读写ini文件中的中文
QString ver = QString("user/name");
QString val = settings.value(ver).toString();
if (val.isEmpty()) { //如果没有用户名就写入
//写入数据
settings.setValue("/user/name", "admin");
settings.setValue("/password/mypass", "123456");
}
//写入数据
settings.setValue("/test/name", "admin");
settings.setValue("/test/mypass", QString::fromLocal8Bit("密码"));
/* 在user的组别下 继续写东西*/
settings.beginGroup("user");
settings.setValue("login",1);
settings.endGroup(); //关闭分组定位,注意如果需切换分组,必须保证关闭。不然切换无效
}
void ConfigIO::LoadIni(QString loadName)
{
//判断文件是否存在
QFileInfo fileInfo("configIO.ini");
if (!fileInfo.isFile())
{
QMessageBox::critical(NULL, QString::fromLocal8Bit("错误"),
QString::fromLocal8Bit("缺少configIO.ini文件!"));
return;
}
QSettings settings("configIO.ini", QSettings::IniFormat);
settings.setIniCodec("utf-8");// 解决乱码
QString ver = QString("%1/Image").arg(loadName);
QString val = settings.value(ver).toString();
QPixmap img(val);
ver = QString("%1/width").arg(loadName);
int wid = settings.value(ver).toInt();
img = img.scaledToWidth(wid, Qt::SmoothTransformation); //图片自适应宽度
backgroundLabel->setPixmap(img);
backgroundLabel->setFixedSize(img.size());
}
void ConfigIO::btnClick()
{
if (flag == 1) {
LoadIni("picture1");
flag = 0;
}
else {
LoadIni("picture2");
flag = 1;
}
}
效果图如下: