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.0

Rectangle {
    visible: true
    width: 400
    height: 800


    Column{
        spacing: 30
        Text {
            id: name
            text: qsTr("登录")
            font.pixelSize: 30
        }

        TextField{
            id:_idinput
            width: 200
            height: 60
        }

        TextField{
            id:_pasinput
            width: 200
            height: 60
        }

        Button{
            width: 200
            height: 40
            Text {
                anchors.centerIn: parent
                text: 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: 30
            Button{
                width: 85
                height: 30
                Text {
                    anchors.centerIn: parent
                    text: qsTr("修改账号")
                    font.pixelSize: 20
                }
                onClicked:{
                    _ModifyID.visible = ! _ModifyID.visible
                }
            }

            Button{
                width: 85
                height: 30
                Text {
                    anchors.centerIn: parent
                    text: 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.0

Rectangle {
    visible: true
    width: 400
    height: 800

    Timer {
        id: timerid
        interval: 3000 // 3000ms = 3 seconds
        running: false
        onTriggered: {
            _ModifyID.visible = false
            timerid.stop()
        }
    }

    Column{
        spacing: 30
        Text {
            id: name
            text: qsTr("修改id")
            font.pixelSize: 30
        }

        TextField{
            id:_idModify
            width: 200
            height: 60
        }

        TextField{
            id:_pasModify
            width: 200
            height: 60
        }

        Button{
            width: 100
            height: 40
            Text {
                anchors.centerIn: parent
                text: 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 = true
                    timerid.start()
                    _idModificationfailure.visible = false
                }
                if(flag === 2){
                    console.log("失败")
                    _idModificationfailure.visible = true
                }
            }
        }

        Text {
            id:_idModificationfailure
            font.pixelSize: 30
            text: qsTr("修改失败")
            visible: false
        }
        Text {
            id:_idModification
            font.pixelSize: 30
            text: qsTr("修改成功")
            visible: false
        }

        Button{
            width: 100
            height: 40
            onClicked: {
               MyTools.gettoolTestInstance().doSomething()
               console.log("aaaaaaaaaaaaaaaaaaaa")
            }
        }
    }

}

 5.修改密码qml

import QtQuick 2.7
import QtQuick.Controls 1.4
import QMLreadini 1.0
import QMLsqlconnect 1.0

Rectangle {
    visible: true
    width: 400
    height: 800

    Timer {
        id: timerpas
        interval: 3000 // 3000ms = 3 seconds
        running: false
        onTriggered: {
            _ModifyPas.visible = false
            timerpas.stop()
        }
    }

    Column{
        spacing: 30
        Text {
            id: name
            text: qsTr("修改Pas")
            font.pixelSize: 30
        }

        TextField{
            id:_Modifyid
            width: 200
            height: 60
        }

        TextField{
            id:_Modifypas
            width: 200
            height: 60
        }

        Button{
            width: 100
            height: 40
            Text {
                anchors.centerIn: parent
                text: 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 = true
                    timerpas.start()
                    _pasModificationfailure.visible = false
                }
                if(flag === 2){
                    console.log("失败")
                    _pasModificationfailure.visible = true
                }
            }
        }
        Text {
            id:_pasModificationfailure
            font.pixelSize: 30
            text: qsTr("修改失败")
            visible: false
        }
        Text {
            id:_pasModification
            font.pixelSize: 30
            text: qsTr("修改成功")
            visible: false
        }
    }
}

6.主页面mian.qml

Login{
     id:_login
     anchors.centerIn: parent
    }
    
    
 ModifyID{
      id:_ModifyID
      anchors.centerIn: parent
     }
   

ModifyPas{
       id:_ModifyPas
       anchors.centerIn: parent
     }
   

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

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

相关文章

C++面向对象程序设计 - 字符串流

文件流是以外存文件为输入输出对象的数据流&#xff0c;字符串流不是以外存文件为输入输出的对象&#xff0c;而以内存中用户定义的字符数组&#xff08;字符串&#xff09;为输入输出的对象&#xff0c;即将数据输出到内存中的字符数组&#xff0c;或者从字符数组&#xff08;…

中间代码生成

一&#xff0e;实验题目 DO-WHILE循环语句的中间代码生成 二&#xff0e;实验目的 通过设计、编制、调试一个 do-while 循环语句的语法及语义分析程序&#xff0c;加深对 法及语义分析原理的理解&#xff0c;并实现词法分析程序对单词序列的词法检查和分析。 三&#xff0e; 实…

c++【入门】正多边形每个内角的度数

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 根据多边形内角和定理&#xff0c;正多边形内角和等于&#xff1a;&#xff08;n &#xff0d; 2&#xff09;180(n大于等于3且n为整数&#xff09;&#xff08;如下图所示是三角形、四边形、五边形、六边形的形状&#xff09…

云服务器CPU和内存直接被zzh恶意挖矿程序打满,如何解决?

回顾 最近在服务器上面部署网站&#xff0c;刚开始使用还是没问题的&#xff0c;当时一段时间之后发现CPU和内存总是被打满&#xff0c;本地没有跑大的应用&#xff0c;主要有mysql、nginx、redis&#xff0c;一度还以为是nginx 的问题&#xff0c;但是后来排除了。之后使用ht…

Python私教张大鹏 Vue3整合AntDesignVue之Anchor 锚点

用于跳转到页面指定位置。 何时使用 需要展现当前页面上可供跳转的锚点链接&#xff0c;以及快速在锚点之间跳转。 案例&#xff1a;锚点的基本使用 核心代码&#xff1a; <template><a-anchor:items"[{key: part-1,href: #part-1,title: () > h(span, {…

GAT1399协议分析(10)--单图像删除

一、官方接口 由于批量删除的接口&#xff0c;图像只能单独删除。 二、wireshark实例 这个接口比较简单&#xff0c;调用request delete即可 文本化&#xff1a; DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Age…

【Proteus8.16】Proteus8.16.SP3.exe的安装包,安装方法

下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14ZlETF7g4Owh8djLaHwBOw?pwd2bo3 提取码&#xff1a;2bo3 管理员打开proteus8.16.SP3.exe一路装就行了&#xff0c;许可证选Licence2.lxk,点安装后关闭&#xff0c;然后继续装完。 然后打开Patch-Proteus-8.16-…

树莓派4B 零起点(一) 树莓派 无屏 从购买到启动

目录 背景 一. 准备工作 二、烧录系统 三、连接系统 背景 准备开发ROS机器人&#xff0c;在淘宝上购买的树莓派4B(4G)到货了&#xff0c;配件都很齐全&#xff0c;那么就直接开箱验货。 一. 准备工作 1 、硬件&#xff1a;(如下图) (我的购买链接: 树莓派4B 4g 套件) 2…

pikachu靶场全流程

目录​​​​​​​ 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存…

搭建python虚拟环境,并在VSCode中使用

创建环境 python -m venv E:\python\flask\venv激活环境 运行下图所示的bat文件 退出环境 执行下面的语句 deactivateVSCode中配置&#xff1a; ①使用CTRLshiftp命令&#xff0c;使用CTRLshiftp命令&#xff0c;输入&#xff1a; Python: Select Interpreter②选择之前创建…

据报道,FTC 和 DOJ 对微软、OpenAI 和 Nvidia 展开反垄断调查

据《纽约时报》报道&#xff0c;联邦贸易委员会 (FTC) 和司法部 (DOJ) 同意分担调查微软、OpenAI 和 Nvidia 潜在反垄断违规行为的职责。 美国司法部将牵头对英伟达进行调查&#xff0c;而联邦贸易委员会将调查 OpenAI 与其最大投资者微软之间的交易。 喜好儿网 今年 1 月&a…

电子电气架构——车载诊断DTC一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

不确定性+电动汽车!含高比例新能源和多类型电动汽车的配电网能量管理程序代码!

前言 能源供应的可持续性和清洁性是当今世界共同关注的议题&#xff0c;配电网与可再生能源发电相结合&#xff0c;通过多能互补和梯级利用&#xff0c;在不同时空取长补短&#xff0c;提高能源利用率&#xff0c;减少温室气体排放&#xff0c;是解决能源短缺和环境问题的有效…

Ruoyi-Vue-Plus 下载启动后菜单无法点击展开,

1.Ruoyi-Vue-Plus框架下载后运行 2.使用mock数据 3.进入页面后无法点击菜单 本以为是动态路由或者菜单逻辑出了问题&#xff0c;最后发现是websocket的问题 解决办法 把这两行代码注释 页面菜单即可点击。 以上。

htb_office

端口扫描 namp -sSVC 10.10.11.1380&#xff0c;445 80端口 robots.txt 只有/administrator可以访问 Joomla joomscan扫描 joomscan --url http://10.10.11.3/ 版本为4.2.7&#xff0c;存在cve CVE-2023-23752 Joomla未授权访问Rest API漏洞 访问路径 /api/index.php/…

推荐系统三十六式学习笔记:原理篇.内容推荐05|从文本到用户画像有多远?

目录 从文本开始构建用户画像一、结构化文本1、TF-IDF2、TextRank3、内容分类&#xff1a;4、实体识别5、聚类6、词嵌入 二、标签选择1、卡方检验2、信息增益 总结 对于一个早期的推荐系统来说&#xff0c;基于内容推荐离不开用户构建一个初级的画像&#xff0c;这种初级的画像…

JAVA高级-反射与动态代理(十五)

观看尚硅谷视频做的视频笔记 一、高级-反射与动态代理&#xff08;十四&#xff09; 1、反射概述 1&#xff09;java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型&#xff0c;运行时类型&#xff0c;而很多时候对象的编译类型和运行时类型不一致。 此处…

数据库分库分表mycat

为啥要分库分表 IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 请求数据太多&#xff0c;带宽不够&#xff0c;网络IO瓶颈。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源&#…

pre-commit 慢

执行这个命令 pre-commit run --all-files 有时候会卡在Initializing environment for https://github.com/xxx那里&#xff0c;如下图&#xff1a; 这个情况可以这样复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python cd coveralls-python python3.1…

c# 学习 2

常量 转义字符 类型转换