3、Qt--配置文件的使用

开发平台:Win10 64位

开发环境:Qt Creator 13.0.0 

构建环境:Qt 5.15.2 +MSVC2019 64位

一、需求及方案

        实际开发过程中,我们需要根据本地的配置文件,去配置我们的程序,比如数据库地址、网络地址等信息,而配置文件的格式一般是.ini、.cfg或者.properties类型的,通过Qt官方提供的QSettings类,就可以实现我们的需求,简化了我们开发的难度!

二、实操

.ini文件可以看作是键值对的集合,在文件中以[section]来表示一个区域,然后在该区域中定义多个键值对,格式如下:

[section]

key1=value1

key2=value2

...

其中[section]表示一个区域,比如说[mysql],就表示是mysql的配置信息,下面使用QSrttings类来读取和写入ini文件。

首先我们需要明确配置文件中有什么,这样在初始化的时候就可以直接生成,不用手动去创建配置文件。

#ifndef CONFIGFILE_H
#define CONFIGFILE_H

#include <QObject>

class configfile
{
public:
    configfile();
    //需要一个文件名,不用设置保存路径,会自动生成在exe同级目录下
    static QString configFileName;
    //需要用到的配置变量
    static QString Account;
    static QString password;

    static QString remoteIp;
    static int remotePort;

    //方法 读写
    static bool checkConfigFile();
    static void newConfigFile();

    static void readConfigFile();
    static void writeConfigFile();

};

#endif // CONFIGFILE_H
#include "configfile.h"
#include <QFileInfo>
#include <QSettings>

configfile::configfile() {}

QString configfile::configFileName="test.ini";
QString configfile::Account="admin";
QString configfile::password="admin";
QString configfile::remoteIp="127.0.0.1";
int configfile::remotePort=502;

//首先检擦下存不存在文件,如果不存在就新建,存在就读写操作
bool configfile::isConfigFileExist()
{

    QFileInfo fileInfo(configfile::configFileName);
    if(fileInfo.isFile())
    {
        //存在情况下,看看内容全不全
        QFile file(configfile::configFileName);
        if (file.size() == 0) {
            configfile::newConfigFile();
            return false;
        }
        //如果配置文件不完整,则以初始值继续运行,并生成配置文件
        if (file.open(QFile::ReadOnly)) {
            bool ok = true;
            while (!file.atEnd()) {
                QString line = file.readLine();
                line = line.replace("\r", "");
                line = line.replace("\n", "");
                QStringList list = line.split("=");

                if (list.count() == 2) {
                    if (list.at(1) == "") {
                        ok = false;
                        break;
                    }
                }
            }

            if (!ok) {
                configfile::newConfigFile();
                return false;
            }
        } else {
            configfile::newConfigFile();
            return false;
        }
        return true;
    }else {
        configfile::newConfigFile();
        return false;
    }
}


//新建配置文件
void configfile::newConfigFile()
{
    writeConfigFile();
}

//读取配置文件
void configfile::readConfigFile()
{
    //先判断配置文件是否存在
    if (!isConfigFileExist()) {
        return;
    }

    QSettings set(configfile::configFileName, QSettings::IniFormat);
    set.setIniCodec("utf-8");
    set.beginGroup("mysql");
    configfile::Account = set.value("Account",configfile::Account).toString();
    configfile::password = set.value("password",configfile::password).toString();
    set.endGroup();

    set.beginGroup("net");
    configfile::Account = set.value("Account",configfile::Account).toString();
    configfile::password = set.value("password",configfile::password).toString();
    set.endGroup();
}

//写入配置文件
void configfile::writeConfigFile()
{
    //下面这段应该会自动生成配置文件?
    QSettings set(configfile::configFileName, QSettings::IniFormat);
    set.beginGroup("mysql");
    set.setValue("Account",configfile::Account);
    set.setValue("password",configfile::password);
    set.endGroup();

    set.beginGroup("net");
    set.setValue("remoteIp",configfile::remoteIp);
    set.setValue("remotePort",configfile::remotePort);
    set.endGroup();
}

三、参考文献

3.1 Qt判断文件、文件夹是否存在,不存在则创建文件夹。_qt 文件不存在则创建-CSDN博客

3.2 Qt基础之配置文件(QSettings) - 浅笑19 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603633.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx--防盗链

盗链 通过在自己网站里面引用别人的资源链接,盗用人家的劳动和资源 referer referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息 正常的referer信息 none&#xff1a;请求报文首部没有referer首部&#xff0c;比如用户直接在浏览器输入域名访问web网站&…

使用 Cython 加密 Python 代码防止反编译

文章目录 前言使用 Cython 加密 Python 代码环境Python 源代码编写 Cython 编译配置文件 编译查看输出文件使用 问题error: Microsoft Visual C 14.0 or greater is requiredpyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directorydynamic…

【已解决】‘pip‘ 不是内部或外部命令问题

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

大模型微调之 在亚马逊AWS上实战LlaMA案例(三)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;三&#xff09; 使用 QLoRA 增强语言模型&#xff1a;Amazon SageMaker 上 LLaMA 2 的高效微调 语言模型在自然语言处理任务中发挥着关键作用&#xff0c;但训练和微调大型模型可能会占用大量内存且耗时。在本文中&…

Springboot整合飞书向群组/指定个人发送消息/飞书登录

Springboot整合飞书向群组发送消息 飞书开放平台创建企业自建应用 添加应用能力-机器人 创建完成后&#xff0c;进入应用详情页&#xff0c;可以在首页看到 App Id 和 App Secret 在飞书pc端创建一群机器人 此处可以拿到该机器人的webhook地址,通过https的方式,也可以调用发送…

为什么说RK3562可以碾压PX30?

在如今的科技市场中&#xff0c;处理器的性能直接决定了设备的运行速度和用户体验。今天&#xff0c;我们将对比瑞芯微旗下的两款处理器&#xff1a;PX30与RK3562。RK3562比PX30的性价比究竟高在哪里&#xff1f; PX30 瑞芯微PX30是一款高性能的四核应用处理器&#xff0c;专…

Android单行字符串末尾省略号加icon,图标可点击

如图 设置仅显示单行字符串&#xff0c;末尾用省略号&#xff0c;加跟一个icon&#xff0c;icon可点击 tvName.text "test"val drawable ResourcesCompat.getDrawable(resources, R.mipmap.icon_edit, null)tvName.setCompoundDrawablesWithIntrinsicBounds(null,…

故障——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题纯数学&#xff0c;考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…

在Leaflet中点对象使用SVG和Canvas两种模式的对比

目录 前言 一、关于SVG和Canvas 1、SVG知识 2、Canvas知识 3、优缺点 二、SVG和Canvas在Leaflet的使用 1、相关类图 2、Leaflet的默认展示方式 三、SVG和Canvas实例及性能对比 1、SVG模式及性能对比 2、Canvas优化 总结 前言 众所周知&#xff0c;在Leaflet当中&#…

vue3配置element-plus时间选择器中文显示

修改main.js import ElementPlus from element-plus import element-plus/dist/index.css // 引入中文包 import zhCn from "element-plus/es/locale/lang/zh-cn"; const app createApp(App) app.use(ElementPlus,{ locale: zhCn, }) //挂载 app.mount(#app)

白盒测试:覆盖测试及测试用例设计

白盒测试&#xff1a;覆盖测试及测试用例设计 一、实验目的 1、掌握白盒测试的概念。 2、掌握逻辑覆盖法。 二、实验任务 某工资计算程序功能如下&#xff1a;若雇员月工作小时超过40小时&#xff0c;则超过部分按原小时工资的1.5倍的加班工资来计算。若雇员月工作小时超过…

数据库系统理论——关系数据库

文章目录 一、关系&#xff08;数据结构&#xff09;1、概述2、名词解释3、关系模式、关系数据库、关系数据库模式4、基本关系的性质 二、关系操作&#xff08;数据操作&#xff09;三、关系的完整性1、实体完整性2 、参照完整性3、用户自定义的完整性 四、关系代数五、习题 前…

Twitch赠送暗区突围测试资格 超简单暗区突围测试资格领取教程

作为直播界的领航者&#xff0c;Twitch平台不仅是全球游戏文化直播的中心舞台&#xff0c;更是频繁联袂各路游戏大作&#xff0c;为粉丝们奉上别具匠心的互动盛宴&#xff0c;让观赛的同时解锁诱人的游戏内惊喜。正值《暗区突围》PC版测试的热潮涌动&#xff0c;Twitch乘势加强…

详细分析McCabe环路复杂度(附例题)

目录 前言1. 基本知识2. 例题 前言 该知识点常出在408或者软考中&#xff0c;对此此文重点讲讲理论知识以及例题 对于例题平时看到也会更新 1. 基本知识 McCabe环路复杂度是一种用于衡量软件代码复杂性的指标&#xff0c;主要是通过计算代码中的控制流图中的环路数量来衡量…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

逆向中webpack需要补充的模块很多怎么办

如下面这种典型的形式 进入i找到加载器 找到加载器所在函数r,在 return e[a].call(c.exports, c, c.exports, r),打上断点。 在控制台打印e,会发现它总共有的模块&#xff0c;这些模块需要我们在别的webpack中复制&#xff0c;有时很多&#xff0c;很麻烦。 我们可以注入代码在…

es6语法总结

【1】语法 &#xff08;1&#xff09;声明变量(let-var-const) 变量提升&#xff1a; 是JavaScript引擎在代码执行前将变量的声明部分提升到作用域顶部的行为。尽管变量的声明被提升了&#xff0c;变量的赋值&#xff08;即初始化&#xff09;仍然保留在原来的位置。因此&…

紫外激光打标机适合在哪些材料表面进行标记

紫外激光打标机适合在多种材料表面进行标记&#xff0c;特别是那些对热敏感或者需要高精度、高清晰度标记的材料。以下是一些常见的适用材料&#xff1a; 1. 塑料&#xff1a;紫外激光打标机在塑料材料上表现尤为出色&#xff0c;因为紫外激光的短波长和高能量密度使得它能够在…

基于树莓派的六足机器人方案设计+源代码+工程内容说明

文章目录 源代码下载地址项目介绍项目内容说明简单预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目内容说明 hardware为项目相关硬件设计 机械结构为六足机器人的3d建模工程&#xff0c;包括本体和云台遥控器在ESP32最小开发板上集成了MPU605…

ChatGPT DALL-E绘图,制作各种表情包,实现穿衣风格的自由切换

DALL-E绘图功能探索&#xff1a; 1、保持人物形象一致&#xff0c;适配更多的表情、动作 2、改变穿衣风格 3、小女孩的不同年龄段展示 4、不同社交平台的个性头像创作 如果不会写代码&#xff0c;可以问GPT。使用地址&#xff1a;我的GPT4 视频&#xff0c;B站会发&#…
最新文章