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…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
uni-app学习笔记二十七--设置底部菜单TabBar的样式
官方文档地址:uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容,通常写在项目的App.vue的onLaunch方法中,用于项目启动时立即执行 重要参数: indexnumber是tabBar 的哪一项&…...
PCA笔记
✅ 问题本质:为什么让矩阵 TT 的行列式为 1? 这个问题通常出现在我们对数据做**线性变换(旋转/缩放)**的时候,比如在 PCA 中把数据从原始坐标系变换到主成分方向时。 📌 回顾一下背景 在 PCA 中ÿ…...
