QT: 读写ini配置文件(实现qml界面登录,修改)
目录
一.功能介绍
二.暴露属性
三.指定INI文件的路径和格式。
四.登录操作
1.检查INI文件中是否含有登录信息;
2.读取存储的ID;
3.读取存储的密码;
4.成功返回1;失败返回2;
五.修改账号
1.检查INI文件中是否含有登录信息;
2.读取存储的ID; 读取存储的密码;
3.判断密码是否正确
4.成功返回1;失败返回2;
六.修改密码
1.检查INI文件中是否含有登录信息;
2.读取存储的ID; 读取存储的密码;
3.判断账号是否正确
4.成功返回1;失败返回2;
七.效果展示
八.代码展示
1.h
2.cpp
3.qml登录
4.qml修改账号
5.修改密码qml
6.主页面mian.qml
一.功能介绍
在Qt中使用QSettings类来读写INI文件,主要作用是保存和读取程序的配置参数。INI文件作为初始化文件,通常用于存储应用程序的设置、用户偏好配置或其他形式的数据。下面将从多个角度进行分析:
1.数据持久化:使用INI文件可以在不同的程序运行会话之间保留配置信息,使得用户可以自定义并保存他们的偏好设置。
2.代码解耦性:通过外部配置文件管理配置项,可以将程序逻辑与配置数据分离,提高代码的可维护性和灵活性。
3.平台兼容性:QSettings支持多种平台和格式,包括Windows注册表、Mac OS X的PLists以及跨平台的INI文件,使得程序更易于迁移和适配不同操作系统。
4.操作简易性:QSettings封装了对INI文件的操作,提供了简单的API来读取和写入键值对,简化了配置文件的管理过程。
5.实时反映性:当程序的配置发生变化时,可以直接写入INI文件,而不需要重启程序,即可使更改即时生效。
6.注释说明性:INI文件支持注释,可以为配置文件中的节(section)或键(key)添加描述,增加文件的可读性和可维护性。
7.结构清晰性:INI文件具有清晰的层级结构,通过节(section)、键(key)、值(value)的组织方式,可以方便地管理和查找配置项。
8.类型安全性:QSettings结合QVariant使用,能够存储多种类型的数据,并且在读取时自动进行类型转换,确保了数据类型的安全性和准确性。
二.暴露属性

1.暴露用户登录属性;
2.暴露修改账号属性;
3.暴露修改密码属性;
三.指定INI文件的路径和格式。

四.登录操作

1.检查INI文件中是否含有登录信息;
2.读取存储的ID;
3.读取存储的密码;
4.成功返回1;失败返回2;

当按钮被点击时,会调用_QMLreadini.userLogin(_idinput.text,_pasinput.text)这个函数,该函数调用C++对象readini的userLogin方法,传入用户输入的用户名(_idinput.text)和密码(_pasinput.text)。
userLogin方法执行后,会返回一个整数 flag,表示登录的结果。根据 flag 的值,会执行不同的操作:
- 如果 flag 为 0,表示没有登录信息,可能会提示用户“空”。
- 如果 flag 为 1,表示登录成功,可以在这里添加成功登录后的操作,例如显示其他界面或者更新状态。
- 如果 flag 为 2,表示登录失败,会提示用户“失败”。
五.修改账号

1.检查INI文件中是否含有登录信息;
2.读取存储的ID; 读取存储的密码;
3.判断密码是否正确
4.成功返回1;失败返回2;

当按钮被点击时,会调用_QMLreadini.setuserid(_idModify.text,_pasModify.text)这个函数,该函数调用C++对象readini的setuserid方法,传入用户输入的用户ID(_idModify.text)和密码(_pasModify.text)。
setuserid方法执行后,会返回一个整数 flag,表示修改账号的结果:
- 如果 flag 为 0,表示用户ID或密码为空。
- 如果 flag 为 1,表示修改账号成功,会显示“修改成功”的文本,并启动一个定时器(
timerid.start(),1秒钟后关闭账号修改页面),同时隐藏“修改失败”的文本。 - 如果 flag 为 2,表示修改账号失败,会显示“修改失败”的文本。
六.修改密码

1.检查INI文件中是否含有登录信息;
2.读取存储的ID; 读取存储的密码;
3.判断账号是否正确
4.成功返回1;失败返回2;

当按钮被点击时,会调用_QMLreadini.setuserpas(_Modifyid.text,_Modifypas.text)这个函数,该函数调用C++对象readini的setuserpas方法,传入用户输入的用户ID(_Modifyid.text)和密码(_Modifypas.text)。
setuserpas方法执行后,会返回一个整数 flag,表示修改密码的结果:
- 如果 flag 为 0,表示用户ID或密码为空。
- 如果 flag 为 1,表示修改密码成功,会显示“修改成功”的文本,并启动一个定时器(
timerpas.start(),1秒钟后关闭密码修改页面),同时隐藏“修改失败”的文本。 - 如果 flag 为 2,表示修改密码失败,会显示“修改失败”的文本。
七.效果展示



八.代码展示
1.h
#ifndef READINI_H
#define READINI_H
#include <QDebug>
#include <QSettings>
#include <QObject>
class QSettings;class readini : public QObject
{Q_OBJECT
public:readini();Q_INVOKABLE int userLogin(QString id , QString pas);Q_INVOKABLE int setuserid(QString id , QString pas);Q_INVOKABLE int setuserpas(QString id , QString pas);private:QString m_id;QString m_pas;QSettings *m_pSettings;
};#endif // READINI_H
2.cpp
#include "readini.h"readini::readini()
{m_pSettings = new QSettings("E:/lzy/setting.ini",QSettings::IniFormat);
}int readini::userLogin(QString id, QString pas)
{if(m_pSettings->contains("login/id")){m_id = m_pSettings->value("login/id").toString();m_pas = m_pSettings->value("login/pas").toString();if(m_id == id && m_pas == pas){qDebug()<<"sssssssssss";return 1;}else {qDebug()<<"fffffffffff";return 2;}}else {qDebug()<<"aaaaaaaaa";}qDebug()<<id<<pas;return 0;}int readini::setuserid(QString id, QString pas)
{if(m_pSettings->contains("login/id")){m_id = m_pSettings->value("login/id").toString();m_pas = m_pSettings->value("login/pas").toString();if(m_pas == pas && id != ""){m_pSettings->beginGroup("login");//小组名m_pSettings->setValue("id",id);m_id = id;m_pSettings->endGroup();return 1;}else{return 2;}}return 0;
}int readini::setuserpas(QString id, QString pas)
{if(m_pSettings->contains("login/pas")){m_id = m_pSettings->value("login/id").toString();m_pas = m_pSettings->value("login/pas").toString();if(m_id == id && pas != ""){m_pSettings->beginGroup("login");//小组名m_pSettings->setValue("pas",pas);m_pas = pas;m_pSettings->endGroup();return 1;}else{return 2;}}return 0;
}
3.qml登录
import QtQuick 2.7
import QtQuick.Controls 1.4
import QMLreadini 1.0
import QMLsqlconnect 1.0Rectangle {visible: truewidth: 400height: 800Column{spacing: 30Text {id: nametext: qsTr("登录")font.pixelSize: 30}TextField{id:_idinputwidth: 200height: 60}TextField{id:_pasinputwidth: 200height: 60}Button{width: 200height: 40Text {anchors.centerIn: parenttext: qsTr("登录")font.pixelSize: 30}onClicked: {var flag = _QMLreadini.userLogin(_idinput.text,_pasinput.text)if(flag === 0){console.log("空")}if(flag === 1){console.log("成功")//_SqlLite.visible = true}if(flag === 2){console.log("失败")}}}Row{spacing: 30Button{width: 85height: 30Text {anchors.centerIn: parenttext: qsTr("修改账号")font.pixelSize: 20}onClicked:{_ModifyID.visible = ! _ModifyID.visible}}Button{width: 85height: 30Text {anchors.centerIn: parenttext: qsTr("修改密码")font.pixelSize: 20}onClicked:{_ModifyPas.visible = !_ModifyPas.visible}}}}}
4.qml修改账号
import QtQuick 2.7
import QtQuick.Controls 1.4
import QMLreadini 1.0
import QMLsqlconnect 1.0Rectangle {visible: truewidth: 400height: 800Timer {id: timeridinterval: 3000 // 3000ms = 3 secondsrunning: falseonTriggered: {_ModifyID.visible = falsetimerid.stop()}}Column{spacing: 30Text {id: nametext: qsTr("修改id")font.pixelSize: 30}TextField{id:_idModifywidth: 200height: 60}TextField{id:_pasModifywidth: 200height: 60}Button{width: 100height: 40Text {anchors.centerIn: parenttext: qsTr("修改账号")font.pixelSize: 20}onClicked: {var flag = _QMLreadini.setuserid(_idModify.text,_pasModify.text)if(flag === 0){console.log("空")}if(flag === 1){console.log("成功")_idModification.visible = truetimerid.start()_idModificationfailure.visible = false}if(flag === 2){console.log("失败")_idModificationfailure.visible = true}}}Text {id:_idModificationfailurefont.pixelSize: 30text: qsTr("修改失败")visible: false}Text {id:_idModificationfont.pixelSize: 30text: qsTr("修改成功")visible: false}Button{width: 100height: 40onClicked: {MyTools.gettoolTestInstance().doSomething()console.log("aaaaaaaaaaaaaaaaaaaa")}}}}
5.修改密码qml
import QtQuick 2.7
import QtQuick.Controls 1.4
import QMLreadini 1.0
import QMLsqlconnect 1.0Rectangle {visible: truewidth: 400height: 800Timer {id: timerpasinterval: 3000 // 3000ms = 3 secondsrunning: falseonTriggered: {_ModifyPas.visible = falsetimerpas.stop()}}Column{spacing: 30Text {id: nametext: qsTr("修改Pas")font.pixelSize: 30}TextField{id:_Modifyidwidth: 200height: 60}TextField{id:_Modifypaswidth: 200height: 60}Button{width: 100height: 40Text {anchors.centerIn: parenttext: qsTr("修改密码")font.pixelSize: 20}onClicked: {var flag = _QMLreadini.setuserpas(_Modifyid.text,_Modifypas.text)if(flag === 0){console.log("空")}if(flag === 1){console.log("成功")_pasModification.visible = truetimerpas.start()_pasModificationfailure.visible = false}if(flag === 2){console.log("失败")_pasModificationfailure.visible = true}}}Text {id:_pasModificationfailurefont.pixelSize: 30text: qsTr("修改失败")visible: false}Text {id:_pasModificationfont.pixelSize: 30text: qsTr("修改成功")visible: false}}
}
6.主页面mian.qml
Login{id:_loginanchors.centerIn: parent}ModifyID{id:_ModifyIDanchors.centerIn: parent}ModifyPas{id:_ModifyPasanchors.centerIn: parent}
相关文章:
QT: 读写ini配置文件(实现qml界面登录,修改)
目录 一.功能介绍 二.暴露属性 三.指定INI文件的路径和格式。 四.登录操作 1.检查INI文件中是否含有登录信息; 2.读取存储的ID; 3.读取存储的密码; 4.成功返回1;失败返回2; 五.修改账号 1.检查INI文件中是否含有登录信…...
DevOps 安全集成:从开发到部署,全生命周期安全守护
目录 一、DevOps 安全集成:为什么要做? 二、DevOps 安全集成:如何做? 三、DevOps 安全集成的优势 四、DevOps 安全集成:一些最佳实践 五、DevOps 安全集成:未来展望 六、思考与建议 七、总结 DevOps…...
R语言数据分析15-xgboost模型预测
XGBoost模型预测的主要大致思路: 1. 数据准备 首先,需要准备数据。这包括数据的读取、预处理和分割。数据应该包括特征和目标变量。 步骤: 读取数据:从CSV文件或其他数据源读取数据。数据清理:处理缺失值、异常值等…...
重构大学数学基础_week04_从点积理解傅里叶变换
这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法,它允许我们将信号或函数从其原始域(通常是时间域或空间域)转换到频域表示。在频域中,信号被表示为其组成频率的幅度和相位,这…...
Shell以及Shell编程
Shell的任务 ①分析命令; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制; ③搜索命令并执行。 内部命令:内嵌在Shell中。 外部命令:存在于磁盘上的独立可执行文件。 #!/bin/bash #! 称为一个幻数&…...
从记忆到想象:探索AI的智能未来
引言 人工智能(AI)在信息处理、数据分析和任务自动化等方面展现了强大的能力。然而,在人类独有的记忆和想象力领域,AI仍然有很长的路要走。加利福尼亚大学戴维斯分校的心理学和神经科学教授查兰兰加纳特(Charan Ranga…...
“安全生产月”专题报道:AI智能监控技术如何助力安全生产
今年6月是第23个全国“安全生产月”,6月16日为全国“安全宣传咨询日”。今年全国“安全生产月”活动主题为“人人讲安全、个个会应急——畅通生命通道”。近日,国务院安委会办公室、应急管理部对开展好2024年全国“安全生产月”活动作出安排部署。 随着科…...
【转】ES, 广告索引
思考: 1)直接把别名切换到上一个版本索引 --解决问题 2)广告层级索引如何解决? -routing、join 3)查询的过程:query and fetch, 优化掉fetch 4)segment合并策略 5)全量写入时副…...
Unity学习要点
前言 学习Unity作为游戏开发的强大工具,对于初学者来说,掌握一些基础而实用的技巧是非常重要的。这不仅能帮助你更快地上手,还能在项目开发过程中提高效率。以下是一些Unity初学者的使用技巧,希望能为你的学习之旅提供帮助。 ##…...
简单使用phpqrcode 生成二维码图片
$path ROOT_PATH; //tp项目根路径 require_once $path.vendor/phpqrcode/phpqrcode.php; //加载phpqrcode库 $url http://.$_SERVER[HTTP_HOST]./home/index/detail?id.$param[id]; $value $url; //二维码内容 $errorCorrectionLevel L; //容错级别 $mat…...
软考架构-计算机网络考点
会超纲,3-5分 网络分类 按分布范围划分 局域网 LAN 10m-1000m左右 房间、楼宇、校园 传输速率高 城域网 MAN 10km 城市 广域网 WAN 100km以上 国家或全球(英特网) 按拓扑结构划分 总线型:利用率低、干…...
渗透测试之内核安全系列课程:Rootkit技术初探(三)
今天,我们来讲一下内核安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在…...
大模型日报2024-06-08
大模型日报 2024-06-08 大模型资讯 AI研究:通过消除矩阵乘法实现高效的大语言模型 摘要: 该AI研究探讨了通过消除矩阵乘法来实现高效且可扩展的大语言模型(LLMs)。此方法旨在提升模型性能,提供更快速和高效的计算方案。 AWS大力投…...
leetcode 1631.最小体力消耗路径
思路:BFS二分 这道题和洛谷上的那个“汽车拉力赛”那道题很相似,但是这道题相较于洛谷那个来说会简单一些。 这里作者一开始写的时候思路堵在了怎么在BFS中用二分,先入为主的以为需要先写出来搜索函数然后再去处理二分的事,但是…...
【ARM64 常见汇编指令学习 19.2 -- ARM64 地址加载指令 ADR 详细介绍】
文章目录 地址加载指令 ADRADR 指令使用场景例子注意事项 地址加载指令 ADR ARMv8 架构引入了一系列的改进和扩展,包括对汇编指令集的更新。在这之中,ADR 指令是一个重要的组成部分,它用于计算并加载一个地址到寄存器。 ADR 指令 ADR 指令…...
vscode输出控制台中文显示乱码最有效解决办法
当VSCode的输出控制台中文显示乱码时,一个有效的解决办法是通过设置环境变量来确保编码的正确性。以下是解决方式: 首先,设置环境变量以修正乱码问题: 如果上述方法没有解决乱码问题,请继续以下步骤: 右键…...
springboot + Vue前后端项目(第十五记)
项目实战第十五记 写在前面1.后端接口实现1.1 用户表添加角色字段1.2 角色表增加唯一标识字段1.3 UserDTO1.4 UserServiceImpl1.5 MenuServiceImpl 2. 前端实现2.1 User.vue2.2 动态菜单设计2.2.1 Login.vue2.2.2 Aside.vue 2.3 动态路由设计2.3.1 菜单表新增字段page_path2.3.…...
如何在Windows 11中恢复丢失的快速访问菜单?这里提供解决办法
序言 在电脑的“快速访问”菜单中找不到固定的项目?或者,整个菜单对你来说已经消失了吗?无论哪种方式,你都可以强制你的电脑恢复菜单并显示其中的所有项目。以下是如何在你的Windows 11电脑上做到这一点。 将文件资源管理器设置为打开到主页 当你在文件资源管理器的左侧…...
变声器软件免费版有哪些?国内外12大热门变声器大盘点!(新)
变声软件是一种人工智能AI音频处理工具,允许用户实时修改自己的声音或改变预先录制的音频。这些软件解决方案可提供不同的效果,如改变声音的音调或速度,或将我们的声音转换成其他人或其他东西的声音,如名人、卡通人物、机器人或不…...
计算机网络 —— 数据链路层(无线局域网)
计算机网络 —— 数据链路层(无线局域网) 什么是无线局域网IEEE 802.11主要标准及其特点: 802.11的MAC帧样式 我们来看看无线局域网: 什么是无线局域网 无线局域网(Wireless Local Area Network,简称WLAN…...
nli-distilroberta-base前端集成案例:Vue.js构建智能文本分析界面
nli-distilroberta-base前端集成案例:Vue.js构建智能文本分析界面 1. 场景价值与方案概述 电商平台的客服系统每天需要处理大量用户咨询,其中很多问题都涉及产品参数的对比(如"这款手机电池容量比A型号大吗?"…...
告别Joplin!用MarkDownload+Obsidian打造你的网页剪藏工作流(附完整配置JSON)
从Joplin到Obsidian:用MarkDownload构建高效网页剪藏系统 每次在网上冲浪时遇到值得保存的内容,你是否也经历过这样的困境?收藏夹里堆满了再也找不到的链接,或是剪藏工具中杂乱无章的片段。作为一个长期依赖Joplin进行知识管理的用…...
企业级Java SMB客户端:jcifs-ng深度架构解析与实战指南
企业级Java SMB客户端:jcifs-ng深度架构解析与实战指南 【免费下载链接】jcifs-ng A cleaned-up and improved version of the jCIFS library 项目地址: https://gitcode.com/gh_mirrors/jc/jcifs-ng jcifs-ng是一个经过彻底重构和优化的Java SMB客户端库&am…...
NaViL-9B图文问答教程:支持中英双语提问的跨语言理解能力实测
NaViL-9B图文问答教程:支持中英双语提问的跨语言理解能力实测 1. 认识NaViL-9B NaViL-9B是一款原生多模态大语言模型,由专业研究机构开发。它最吸引人的特点是能够同时理解文字和图片内容,并且支持中文和英文两种语言的提问。想象一下&…...
从‘跟网’到‘构网’:手把手教你用MATLAB/Simulink搭建虚拟同步机(VSG)仿真模型(附模型下载)
从零构建虚拟同步机:MATLAB/Simulink实战指南 电力电子工程师们正面临一个新时代的挑战——如何让逆变器从被动"跟网"转变为主动"构网"。想象一下,当你第一次在示波器上看到自己搭建的虚拟同步机模型成功响应电网频率波动时…...
怎样快速管理Windows预览版:离线注册工具完整使用手册
怎样快速管理Windows预览版:离线注册工具完整使用手册 【免费下载链接】offlineinsiderenroll 项目地址: https://gitcode.com/gh_mirrors/of/offlineinsiderenroll 想要体验Windows最新功能但又不想绑定微软账户?OfflineInsiderEnroll为你提供了…...
Python服务内存持续增长?5个被忽略的__del__陷阱+3种RAII式资源封装模板,今天必须修复!
第一章:Python服务内存持续增长的智能体诊断全景图Python服务在长期运行中出现内存持续增长,是生产环境中高频且隐蔽的稳定性风险。传统人工排查依赖经验与断点调试,难以覆盖异步任务、闭包引用、第三方库缓存等复杂场景。本章构建一个面向可…...
深入 Spring 源码,剖析设计模式的落地实践
写在文章开头 阅读源码是理解框架最有效的方式之一,Spring 源码中蕴含了大量设计模式的经典应用。本文将从源码层面深入剖析这些设计模式,带你理解框架设计精髓,掌握在实际项目中灵活运用的能力。 你好,我是 SharkChili ,Java Guide 核心维护者之一,对 Redis、Nighting…...
手把手教你用Python+AI大模型,把Yapi接口文档变成自动化测试脚本(附避坑指南)
用Python与大模型实现Yapi接口自动化测试的工程化实践 在中小型技术团队中,接口测试往往是质量保障的薄弱环节。传统手工编写测试用例的方式不仅耗时耗力,更难以应对快速迭代的开发节奏。本文将分享如何利用Python生态与AI大模型能力,将Yapi平…...
24小时运行实测:OpenClaw+nanobot自动化监控脚本稳定性报告
24小时运行实测:OpenClawnanobot自动化监控脚本稳定性报告 1. 为什么需要24小时自动化监控? 作为一名独立开发者,我经常遇到这样的困境:凌晨三点服务器突然宕机,等早上发现时已经损失了大量用户。传统监控工具要么太…...
