qt 读写配置文件

在QT开发过程中,常常会使用配置文件(.ini)写入关键信息,配置文件的读写也很简单。

开发环境:vs2017 + qt5.9.8

其文件格式一般为

[section]           // 节名
key = value         //键 = 值
key2 = value2       //键 = 值

1.配置文件的读过程

通过配置文件读入两张图片,做一个简单的点击按钮切换背景图片的示例
读取文件的代码在下方代码块里,可以直接下拉看关键代码
  1. 首先在资源文件中添加两张背景图片
    在这里插入图片描述

  2. 写好一个配置文件,名称为configIO.ini,其中包含两个"节",两个节下面的键值包括图片的路径和需要的图片宽度。
    在这里插入图片描述

  3. 读取配置文件代码如下。在读取配置文件之前应先判断该文件是否存在。

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;
	}
}

效果图如下:
在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值