当前位置: 首页 > news >正文

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++对象readiniuserLogin方法,传入用户输入的用户名(_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++对象readinisetuserid方法,传入用户输入的用户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++对象readinisetuserpas方法,传入用户输入的用户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文件中是否含有登录信息&#xff1b; 2.读取存储的ID&#xff1b; 3.读取存储的密码; 4.成功返回1&#xff1b;失败返回2&#xff1b; 五.修改账号 1.检查INI文件中是否含有登录信…...

DevOps 安全集成:从开发到部署,全生命周期安全守护

目录 一、DevOps 安全集成&#xff1a;为什么要做&#xff1f; 二、DevOps 安全集成&#xff1a;如何做&#xff1f; 三、DevOps 安全集成的优势 四、DevOps 安全集成&#xff1a;一些最佳实践 五、DevOps 安全集成&#xff1a;未来展望 六、思考与建议 七、总结 DevOps…...

R语言数据分析15-xgboost模型预测

XGBoost模型预测的主要大致思路&#xff1a; 1. 数据准备 首先&#xff0c;需要准备数据。这包括数据的读取、预处理和分割。数据应该包括特征和目标变量。 步骤&#xff1a; 读取数据&#xff1a;从CSV文件或其他数据源读取数据。数据清理&#xff1a;处理缺失值、异常值等…...

重构大学数学基础_week04_从点积理解傅里叶变换

这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法&#xff0c;它允许我们将信号或函数从其原始域&#xff08;通常是时间域或空间域&#xff09;转换到频域表示。在频域中&#xff0c;信号被表示为其组成频率的幅度和相位&#xff0c;这…...

Shell以及Shell编程

Shell的任务 ①分析命令&#xff1b; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制&#xff1b; ③搜索命令并执行。 内部命令&#xff1a;内嵌在Shell中。 外部命令&#xff1a;存在于磁盘上的独立可执行文件。 #&#xff01;/bin/bash #! 称为一个幻数&…...

从记忆到想象:探索AI的智能未来

引言 人工智能&#xff08;AI&#xff09;在信息处理、数据分析和任务自动化等方面展现了强大的能力。然而&#xff0c;在人类独有的记忆和想象力领域&#xff0c;AI仍然有很长的路要走。加利福尼亚大学戴维斯分校的心理学和神经科学教授查兰兰加纳特&#xff08;Charan Ranga…...

“安全生产月”专题报道:AI智能监控技术如何助力安全生产

今年6月是第23个全国“安全生产月”&#xff0c;6月16日为全国“安全宣传咨询日”。今年全国“安全生产月”活动主题为“人人讲安全、个个会应急——畅通生命通道”。近日&#xff0c;国务院安委会办公室、应急管理部对开展好2024年全国“安全生产月”活动作出安排部署。 随着科…...

【转】ES, 广告索引

思考&#xff1a; 1&#xff09;直接把别名切换到上一个版本索引 --解决问题 2&#xff09;广告层级索引如何解决&#xff1f; -routing、join 3&#xff09;查询的过程&#xff1a;query and fetch, 优化掉fetch 4&#xff09;segment合并策略 5&#xff09;全量写入时副…...

Unity学习要点

前言 学习Unity作为游戏开发的强大工具&#xff0c;对于初学者来说&#xff0c;掌握一些基础而实用的技巧是非常重要的。这不仅能帮助你更快地上手&#xff0c;还能在项目开发过程中提高效率。以下是一些Unity初学者的使用技巧&#xff0c;希望能为你的学习之旅提供帮助。 ##…...

简单使用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…...

软考架构-计算机网络考点

会超纲&#xff0c;3-5分 网络分类 按分布范围划分 局域网 LAN 10m-1000m左右 房间、楼宇、校园 传输速率高 城域网 MAN 10km 城市 广域网 WAN 100km以上 国家或全球&#xff08;英特网&#xff09; 按拓扑结构划分 总线型&#xff1a;利用率低、干…...

渗透测试之内核安全系列课程:Rootkit技术初探(三)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…...

大模型日报2024-06-08

大模型日报 2024-06-08 大模型资讯 AI研究&#xff1a;通过消除矩阵乘法实现高效的大语言模型 摘要: 该AI研究探讨了通过消除矩阵乘法来实现高效且可扩展的大语言模型&#xff08;LLMs&#xff09;。此方法旨在提升模型性能&#xff0c;提供更快速和高效的计算方案。 AWS大力投…...

leetcode 1631.最小体力消耗路径

思路&#xff1a;BFS二分 这道题和洛谷上的那个“汽车拉力赛”那道题很相似&#xff0c;但是这道题相较于洛谷那个来说会简单一些。 这里作者一开始写的时候思路堵在了怎么在BFS中用二分&#xff0c;先入为主的以为需要先写出来搜索函数然后再去处理二分的事&#xff0c;但是…...

【ARM64 常见汇编指令学习 19.2 -- ARM64 地址加载指令 ADR 详细介绍】

文章目录 地址加载指令 ADRADR 指令使用场景例子注意事项 地址加载指令 ADR ARMv8 架构引入了一系列的改进和扩展&#xff0c;包括对汇编指令集的更新。在这之中&#xff0c;ADR 指令是一个重要的组成部分&#xff0c;它用于计算并加载一个地址到寄存器。 ADR 指令 ADR 指令…...

vscode输出控制台中文显示乱码最有效解决办法

当VSCode的输出控制台中文显示乱码时&#xff0c;一个有效的解决办法是通过设置环境变量来确保编码的正确性。以下是解决方式&#xff1a; 首先&#xff0c;设置环境变量以修正乱码问题&#xff1a; 如果上述方法没有解决乱码问题&#xff0c;请继续以下步骤&#xff1a; 右键…...

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音频处理工具&#xff0c;允许用户实时修改自己的声音或改变预先录制的音频。这些软件解决方案可提供不同的效果&#xff0c;如改变声音的音调或速度&#xff0c;或将我们的声音转换成其他人或其他东西的声音&#xff0c;如名人、卡通人物、机器人或不…...

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层&#xff08;无线局域网&#xff09; 什么是无线局域网IEEE 802.11主要标准及其特点&#xff1a; 802.11的MAC帧样式 我们来看看无线局域网&#xff1a; 什么是无线局域网 无线局域网&#xff08;Wireless Local Area Network&#xff0c;简称WLAN…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...