热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1、Qt登录界面(一):accept方式

一、功能描述1、输入用户名和密码进行操作2、默认用户名(qwe)和默认密码(123)加密保存到本地3、解释模式对话框&

一、功能描述

1、输入用户名和密码进行操作

2、默认用户名(qwe)和默认密码(123)加密保存到本地

3、解释模式对话框,以及exec()的用法,accept()和accepted的概念2015.6.5 qt学习笔记 accept()概念_xdlichen的专栏-CSDN博客本篇,会重点讲述模式对话框,以及exec()的用法,accept()和accepted的概念。一.非模式对话框非模式对话框是和同一个程序中其它窗口操作无关的对话框。在字处理软件中查找和替换对话框通常是非模式的来允许同时与应用程序主窗口和对话框进行交互。调用show()来显示非模式对话框。show()立即返回,这样调用代码中的控制流将会继续。在实践中你将会经常调用showhttps://blog.csdn.net/xdlichen/article/details/46374517


二、项目创建

1、新建项目,选择“Qt Widgets Application”,点击“Choose” 

2、输入项目名,选择文件路径,点击“下一步”

 3、选择“Desktop...MinGW..”,点击“下一步”

 4、文件名开头大写(个人习惯),点击“下一步” 

 5、点击“完成” 

 6、右击“LoginDialogAccept”->Add New...(添加新文件)

7、选择Qt -> Qt 设计师界面类 

8、选择"Dialog without Buttons",点击“下一步”

9、文件名开头大写,点击“下一步”

10、点击“完成”


三、界面布局

1、双击“LoginDialog.ui” 

2、 界面上拖拽一个“label”控件,,

 更改text为“登录界面”,水平居中布局“AlignHCenter”

字体大小“25”,更改控件大小使字显示完全

3、拖拽两个“label”,分别更改text为“用户名:”、“密 码:” ;再拖拽两个“lineedit”

 选中第一个lineedit,objectName更改为“usernameEdit”

 水平居中布局“AlignHCenter”

  选中第二个lineedit,objectName更改为“passwordEdit”

 echoMode为“Password”,水平居中布局“AlignHCenter”

选中四个控件,点击“在窗体布局中布局”

4、拖拽两个pushButton,第一个pushButton,objectName更改为“loginButton”,text更改为“登录”

第二个pushButton,objectName更改为“exitButton”,text更改为“退出”

选中两个pushButton,点击“水平布局” 

 5、拖拽四个"Vertical Spacer",右击界面->布局->栅格布局

 6、右击“登录”按键->转到槽->选择“clicked()”->点击“OK”

  7、右击“退出”按键->转到槽->选择“clicked()”->点击“OK”


四、代码演示

1、main.cpp

#include "MainWindow.h"
#include
#include "LoginDialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);LoginDialog login;if (login.exec() == QDialog::Accepted) //当用户名和密码正确时,接收到Accepted信号{MainWindow w;w.show();return a.exec();}else{return 0;}
}

2、 LoginDialog.h

#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H#include namespace Ui {
class LoginDialog;
}class LoginDialog : public QDialog
{Q_OBJECTpublic:explicit LoginDialog(QWidget *parent = nullptr);~LoginDialog();private slots:void on_loginButton_clicked();void on_exitButton_clicked();private:Ui::LoginDialog *ui;QString m_qstrFileName; //文件名
};#endif // LOGINDIALOG_H

3、LoginDialog.cpp

#include "LoginDialog.h"
#include "ui_LoginDialog.h"
#include
#include
#include
#include LoginDialog::LoginDialog(QWidget *parent) :QDialog(parent),ui(new Ui::LoginDialog)
{ui->setupUi(this);//标题this->setWindowTitle("登录界面");//登录文件m_qstrFileName = QCoreApplication::applicationDirPath() + "/config.ini";//设置配置文件的目录和位置;如果没有,会自动创建QSettings setting(m_qstrFileName, QSettings::IniFormat);//如果文件不存在用户名和密码信息if (!(setting.contains(tr("login/username")) && setting.contains(tr("login/password")))){//用户名QByteArray byteUser = "qwe";QByteArray byteUserMd5 = QCryptographicHash::hash(byteUser, QCryptographicHash::Md5); //加密QString strUserMd5 = byteUserMd5.toHex();//密码QByteArray bytePwd = "123";QByteArray bytePwdMd5 = QCryptographicHash::hash(bytePwd, QCryptographicHash::Md5);QString strPwdMd5 = bytePwdMd5.toHex();//写入数据setting.beginGroup(tr("login"));//节点开始setting.setValue("username", strUserMd5); //设置key和value,也就是参数和值setting.setValue("password", strPwdMd5);}
}LoginDialog::~LoginDialog()
{delete ui;
}//登录
void LoginDialog::on_loginButton_clicked()
{if(ui->usernameEdit->text().isEmpty()){QMessageBox::critical(this, tr("提示"), tr("用户名不能为空"));return;}if(ui->passwordEdit->text().isEmpty()){QMessageBox::critical(this, tr("提示"), tr("密码不能为空"));return;}QSettings setting(m_qstrFileName, QSettings::IniFormat);//用户名QByteArray byteUser = ui->usernameEdit->text().toLatin1();QByteArray byteUserMd5 = QCryptographicHash::hash(byteUser, QCryptographicHash::Md5); //加密QString strUserMd5 = byteUserMd5.toHex(); //QByteArray 转 QString//用户名正确if (strUserMd5 == setting.value("/login/username").toString()){//密码QByteArray bytePwd = ui->passwordEdit->text().toLatin1();QByteArray bytePwdMd5 = QCryptographicHash::hash(bytePwd, QCryptographicHash::Md5);QString strPwdMd5 = bytePwdMd5.toHex();//密码正确if (strPwdMd5 == setting.value("/login/password").toString()){accept(); //用户名和密码正确发送accept()信号}else{QMessageBox::critical(this, tr("提示"), tr("密码输入错误"));ui->passwordEdit->setFocus(); //获取焦点}}else{QMessageBox::critical(this, tr("提示"), tr("用户名输入错误"));ui->usernameEdit->setFocus();}
}//退出
void LoginDialog::on_exitButton_clicked()
{//this->close();reject();
}

4、其他保持不变


五、运行测试

1、Ctrl+r,运行程序

 2、当用户名不对时

3、当密码不对时

4、当用户名和密码都对时,登录界面关闭 

 MainWindow界面显示

 5、在程序运行目录有个config.ini文件,存放着加密后的用户名和密码


六、代码下载

https://download.csdn.net/download/Viciower/36788383


推荐阅读
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 为了在VS2017和Qt环境中高效配置Open Inventor与Coin3D,本文提供了详细的实操指南和验证步骤。通过这些步骤,用户可以顺利导入机械臂模型进行三维仿真。本文详细介绍了Coin3D作为开源软件的优势及其在三维图形渲染中的应用,并提供了具体的配置方法和常见问题的解决方案。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
author-avatar
灰常奈-ping__
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有