QT: 读写ini配置文件(实现qml界面登录,修改)

news2025/1/19 20:28:45

目录

一.功能介绍

二.暴露属性

三.指定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
     }
   

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# Onnx E2Pose人体关键点检测

C# Onnx E2Pose人体关键点检测 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name&#xff1a;inputimg tensor&#xff1a;Float[1, 3, 512, 512] --------------------------------------------------------------- Outputs ---…

pycharm链接auto al服务器

研0提前进组&#xff0c;最近阻力需求是把一个大模型复现&#xff0c;笔者电脑18年老机子&#xff0c;无法满足相应的需求。因此租用auto dl服务器。本文记录自己使用pycharm&#xff08;专业版&#xff09;链接auto dl期间踩过的坑。 1.下载pycharm专业版 这一步不解释了&am…

智慧启航 网联无限丨2024高通汽车技术与合作峰会美格智能分论坛隆重举行

5月30日下午&#xff0c;以“智慧启航 网联无限”为主题的2024高通汽车技术与合作峰会&美格智能分论坛在无锡国际会议中心隆重举行&#xff0c;本次论坛由高通技术公司与美格智能技术股份有限公司共同主办&#xff0c;上海市车联网协会、江苏省智能网联汽车产业创新联盟、江…

Android 如何保证开启debug模式之后再启动

很多时候会需要debug看Android启动时候的一些数据&#xff0c;但很多时候会存在自己开启debug后app已经过了自己要debug的那段代码的时机了。 那么怎么样可以保证一定能让启动后不会错过自己要debug的那段代码执行的时机呢&#xff1f; 可以用下面这行命令&#xff0c;其中co…

LabVIEW版本控制

LabVIEW作为一种流行的图形化编程环境&#xff0c;在软件开发中广泛应用。有效地管理版本控制对于确保软件的可靠性和可维护性至关重要。LabVIEW提供了多种方式来管理VI和应用程序的修订历史&#xff0c;以满足不同规模和复杂度的项目需求。 LabVIEW中的VI修订历史 LabVIEW内置…

遭遇Device Association Service占用CPU和内存过高异常

1.异常描述 在蓝牙设备搜索和配对过后&#xff0c;系统界面卡住了&#xff0c;查找了下任务管理器&#xff0c;发现有一个主机服务占用了过多的CPU和内存&#xff0c;且不断的在增长。截图如下&#xff1a; 百度查了下&#xff0c;Device Association Service是一个Win10系统服…

Oracle创建用户/表空间/赋权常规操作

1. 登录oracle su - oracle sqlplus / as sysdba 2.查看库里存在的用户,防止冲突 SELECT username FROM all_users ORDER BY username; 3.查看库里存在的表空间,防止冲突 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space_MB f…

像图一样交流:为大语言模型编码图

译者 | 高永祺 单位 | 东北大学自然语言处理实验室 原文链接&#xff1a;https://blog.research.google/2024/03/talk-like-graph-encoding-graphs-for.html 1.作者介绍 Bahare Fatemi&#xff0c;谷歌蒙特利尔研究部门的研究科学家&#xff0c;专门从事图表示学习和自然语言…

关于nginx的一些介绍

一、Nginx 简介 中文简介文档 二、Centos 安装 Nginx 2.1 安装编译工具及库文件 $ yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel2.2 安装 pcre pcre 作用是 Nginx 支持 Rewrite 功能 $ cd /usr/local/src $ wget http://downloads.sourcef…

VUE3 学习笔记(12):对比Vuex与Pinia状态管理的基本理解

在组件传值中&#xff0c;当嵌套关系越来越复杂的时候必然会将混乱&#xff0c;是否可以把一些值存在一个公共位置&#xff0c;无须传值直接调用呢&#xff1f;VUEX应运而生&#xff0c;但是从VUE3开始对VUEX的支持就不那么高了&#xff0c;官方推荐使用Pinia。 Vuex配置 ST1:…

1.1 OpenCV随手简记(一)

OpenCV学习篇 OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉库&#xff0c;它提供了大量的算法和函数&#xff0c;用于图像处理、计算机视觉和机器学习等领域。 1. OpenCV 简介 1.1 OpenCV 的起源和发展 OpenCV 项目始于 1999 年&#xff0c;由 In…

【C#学习笔记】属性和字段

文章目录 前言属性和字段的区别字段访问修饰符和关键字定义变量类型的定义变量命名变量的赋值 属性 不同的使用情况 前言 最近在工作的过程中常常会觉得自己在程序设计方面的能力还是有欠缺。例如一直对于变量的声明感到不足&#xff0c;在工作中为了图方便总是直接public定义…

计算机图形学入门06:视口变换

在前面的内容中&#xff0c;在MVP变换(模型变换&#xff0c;视图变换&#xff0c;投影变换)完后&#xff0c;所有的物体位置都变换到了[-1, 1]的标准立方体里&#xff0c;下一步要把物体绘制到屏幕(Screen)上。 1.什么是屏幕&#xff1f; 对于图形学来说把屏幕抽象的认为是一个…

解锁EasyRecovery2024专业版!仅需一键点击恢复数据即可完美数据恢复

EasyRecovery2024是一款专业的数据恢复软件&#xff0c;它能够帮助用户找回因各种原因丢失的数据。然而&#xff0c;有些用户为了节省开支&#xff0c;可能会寻找破解版&#xff0c;也就是所谓的crack版本。但是&#xff0c;使用破解版软件存在很多风险&#xff0c;包括但不限于…

开关电源基本原理2

目录 开关电源的传递函数 电感量的计算​编辑 Buck电路分析 Boost电路分析 Buck-Boost电路分析 开关电源的传递函数 占空比Dton/Tton/(tontoff) 由EtVontonVofftoff 得 &#xff08;适用于所有拓扑&#xff09; 表1.三种变换器的传递函数 电感量的计算 其中&#xf…

高效数据处理的前沿:【C++】、【Redis】、【人工智能】与【大数据】的深度整合

目录 1.为什么选择 C 和 Redis&#xff1f; 2.人工智能与大数据的背景 1.大数据的挑战 2.人工智能的需求 3.C 与 Redis 的完美结合 1.安装 Redis 和 Redis C 客户端 2.连接 Redis 并进行数据操作 高级数据操作 列表操作 哈希操作 4.与大数据和人工智能结合 5.实际应…

Vue3-Ref Reactive toRef toRefs对比学习、标签ref与组件ref

响应式数据&#xff1a; Ref 作用&#xff1a;定义响应式变量。 语法&#xff1a;let xxx ref(初始值)(里面可以是任何规定内类型、数组等)。 返回值&#xff1a;一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的。 注意点&am…

AndroidStudio中debug.keystore的创建和配置使用

1.如果没有debug.keystore,可以按照下面方法创建 首先在C:\Users\Admin\.android路径下打开cmd窗口 之后输入命令:keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 输入两次密码(密码不可见,打码处随便填写没关系) 2.在build…

【DSP】xDAIS算法标准

1. 简介 在安装DSP开发支持包时&#xff0c;有名为 “xdais_7_21_01_07”文件夹。xDAIS全称: TMS320 DSP Algorithm Standard(算法标准)。39条规则&#xff0c;15条指南。参考文档。参考文章。 2. 三个层次 3.接口 XDAIS Digital Media。编解码引擎。VISA&#xff08;Video&…

PS的抠图算法原理剖析 1

以这个抠tree为例子 在PS里&#xff0c;操作过程是让你开启R G B三个通道 分别看一下 哪一个的对比最明显 上面的图片 树叶肯定B最少 天空B富裕&#xff0c;所以对比最明显的就用B通道 然后使用一些奇怪的函数&#xff0c;把texture.bbb这张图片变成黑白&#xff0c;纯黑纯白 那…