最近看到很多人都在看Qt怎么使用QSettings记住用户名密码。

QSettings类提供了Qt对配置文件的操作,最直接的是对 ini 配置文件的操作。用它来简单的做记住用户名密码的操作是有局限性的。

因为如果是简单的最直接的操作并没有做其他操作的话,ini 配置文件是明文的,相对来说,是数据不安全的。特别是针对密码这种很敏感的信息来说。

我们用QSettings类来操作ini文件。

下面我们先定义几个宏定义函数,方便后面的操作。定义这几个函数的目的是为了偷懒,毕竟如果后续可能会有很多的相同的代码。

#define LOAD_CFG_VARIANT(x)     cfg.value(x)
#define SAVE_CFG_VARIANT(x, y)  cfg.setValue(x, y)
#define REMOVE_CFG_VARIANT(x)   cfg.remove(x)

我们再用一个宏来定义一个固定的路径。

#define CONFIGPATH QCoreApplication::applicationDirPath() + "/config/"

我们同样提供两个函数,设置和读取配置的函数。

QVariant FileHelper::getSettings(const QString& group, const QString& key)
{QSettings cfg(CONFIGPATH + "config.ini", QSettings::IniFormat);cfg.beginGroup(group);QVariant value = LOAD_CFG_VARIANT(key);cfg.endGroup();return value;
}

上面这个函数是读取配置的方法,返回值使用 QVariant 类型是因为,配置文件是可能保存任何类型的数据,我们也就能够通过模板的读取方式来获取相对应的值。

FileHelper::instance().getSettings("", "").value<T>();

设置配置文件的时候有也使用 QVariant 类型。

void FileHelper::setSettings(const QString& group, const QString& key, const QVariant& value)
{QSettings cfg(CONFIGPATH + "config.ini", QSettings::IniFormat);cfg.beginGroup(group);SAVE_CFG_VARIANT(key, value);cfg.endGroup();
}

如上所示是设置配置文件的方法。

有了上面的这两个方法,我们还可以拓展延伸很多的方法。比如,一次设置或者读取一个Group的所有数据。

使用QSettings 类最主要的方法,也就是读取合和设置了。有了上面这两个方法,其他多记住密码等也都只是单纯的使用这两个方法实现业务逻辑。

下面的函数在LoginDialog的构造函数中被执行,也就是在被构造的时候读取配置文件并初始化界面。

void LoginDialog::initPage()
{QString r = FileHelper::instance().getSettings("", "").value<QString>();ui->btnRemember->setChecked(FileHelper::instance().getSettings("Login", "remember").toBool());ui->btnAutoLogin->setChecked(FileHelper::instance().getSettings("Login", "auto").toBool());if(ui->btnAutoLogin->isChecked() || ui->btnRemember->isChecked()){ui->lnName->setText(FileHelper::instance().getSettings("Login", "user").toString());ui->lnPasswd->setText(FileHelper::instance().getSettings("Login", "pwd").toString());}if(ui->btnAutoLogin->isChecked()){//@todo...//ui->btnLogin->click();}
}

而对登陆和取消的按钮操作如下:

connect(ui->btnCancel, &QPushButton::clicked, [=]{reject();
});

LoginDialog我们使用了QDialog,选择这个类主要是因为模特框的特性。

connect(ui->btnLogin, &QPushButton::clicked, this, [this]{QFuture<bool> func = QtConcurrent::run(this, &LoginDialog::onLogin, ui->lnName->text(), ui->lnPasswd->text());if(func.result()){//successfully, @todo something...qDebug() << "Login " << func.result();if(ui->btnAutoLogin->isChecked() || ui->btnRemember->isChecked()){FileHelper::instance().setSettings("Login", "user", ui->lnName->text());FileHelper::instance().setSettings("Login", "pwd", ui->lnPasswd->text());FileHelper::instance().setSettings("Login", "remember", ui->btnRemember->isChecked());FileHelper::instance().setSettings("Login", "auto", ui->btnAutoLogin->isChecked());}accept();}
});

如上,我们就实现了记住密码的配置文件操作。


使用QSettings类在记住密码的这个功能上其实不是最好的选择,主要是因为数据的安全性没办法保证。

如果要考虑记住密码,建议使用加密数据库,或者对配置文件进行加密处理,以保证数据安全。

测试代码。

QSettings实现记住密码相关推荐

  1. 记住密码以及Android 列表的操作

    1.综合使用RecycleView,CardView,Adapter实现一个宝宝相册,并将其加入到实验一形成的应用中,使得:用户成功登录后转到宝宝相册所在的主界面.还要求实现:用户单击对应的列表子项的 ...

  2. Cookie实现记住密码、自动登录

    前端代码 <form id="form" action="xxx" method="post"><div><i ...

  3. AppCan用cookie实现记住密码功能 [APP]

    今天想做个在应用上记住密码的功能.想了一下,先用COOKIE来测试.COOKIE保存在客户端. 关于COOKIE在手机上安不安全的问题,以后再讨论. 其实想过在手机上创建文件保存密码,但是,没有时间, ...

  4. android 自动登录机制,Android登录记住密码以及自动登录的实现

    记住密码以及自动登录的实现主要依赖于SharedPreferences类的使用,SharedPreferences是一个轻量级的存储类,用于存储一些小数据,比如登录账号密码以及状态信息等. 本文章只针 ...

  5. Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)(转载)

    SharedPreferences介绍: SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置参数,它是采用xml文件存放数据的,文件存放在" ...

  6. java shiro 访问频率_java shiro配置记住密码功能 RememberMe

    一般来讲,记住密码的基本处理,就是把用户的一些基本信息(密码)存入浏览器的Cookie,下次登录的时候优先验证Cookie,后端做处理:以此来实现记住密码的功能!使用shiro自带的RememberM ...

  7. 引用借以记录借鉴 实现记住密码和自动登录功能

    WEB页面代码: <form id="Form1" runat="server"><input type="hidden" ...

  8. 业务系统实现记住密码和自动登录功能

    业务系统实现记住密码和自动登录功能 公司的业务系统本来是受域控的,用户不需要登录可以直接访问系统.当然,虽然不用人工登录,系统本身会读取电脑的用户名为登录标识,对系统操作权限和记录也是以电脑名.近段时 ...

  9. 安卓实现记住密码登陆功能

    在安卓程序中,我们经常会使用到很多登陆的功能,会看到很多记住密码的地方.这里,我给大家写一个简单的记住密码的功能.注意,这里是简单的记住密码功能,仅用于练习学习用哦.这个程序主要是给学习安卓的朋友作为 ...

  10. android教程登陆,【教程】Android 记住密码和自动登录界面的实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 登录界面源码: LoginActivity.java public class LoginActivity extends Activity { priv ...

最新文章

  1. [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal
  2. 方立勋_30天掌握JavaWeb_JavaBean、mvc开发模式、el表达式、jstl标签
  3. 东北大哥在线反套路hhhhhh | 今日最佳
  4. 敏捷开发绩效管理之四:为团队设立外部绩效目标(目标管理,外向型绩效)...
  5. !Spring Aop中四个重要概念,切点,切面,连接点,通知
  6. Getphonenumber获得电话号码的例子
  7. hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...
  8. 哨兵2号(Sentinel-2)介绍、下载、预处理及批处理
  9. 逻辑卷管理(LVM)
  10. 小爱同学电脑版安装教程
  11. python里如何打开文件_python如何打开一个txt文件
  12. C#/VB.NET 读取条码类型及条码在图片中的坐标位置
  13. 全网目前最全python例子
  14. mw320r虚拟服务器,水星MW320R路由器桥接设置教程-水星路由器设置
  15. 联想服务器AR系列,目前为止最好的AR游戏设备竟然出自联想
  16. java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程
  17. 解读WPF中的Binding
  18. “数”峰亮剑,优炫数据库助力国产数据库算法对抗赛成功举办
  19. 公众号内容拓展学习笔记(2021.5.2)
  20. DNS的域名的解析解决办法(openDNS)

热门文章

  1. iOS中 语音识别功能/语音转文字教程详解
  2. Java架构师成长路线总结2021版(持续更新)
  3. plc和c语言和cnc,cnc数控编程和plc编程哪个难学
  4. Recyclerview-BRVAH使用
  5. 1 Go 语言环境安装
  6. 斗鱼实名认证 mysql_我告诉你斗鱼实名认证怎么取消
  7. idea使用svn拉取项目代码_idea下载svn的项目并且运行操作
  8. Android网络编程之——文件断点下载(暂停/继续/重新下载)
  9. VDN For PB Web实现消息推送
  10. 12CPU数据通路的功能和基本结构