Qt登录界面

头文件:

#ifndef QDLGLOGIN_H
#define QDLGLOGIN_H#include <QDialog>namespace Ui {
class dlgLogin;
}class QDlgLogin : public QDialog
{Q_OBJECTprivate:bool    m_moving=false;//表示窗口是否在鼠标操作下移动QPoint  m_lastPos;  //上一次的鼠标位置QString m_user="user"; //初始化用户名QString m_pswd="12345";//初始化密码,未加密的int m_tryCount=0; //试错次数void    readSettings(); //读取设置,从注册表void    writeSettings();//写入设置,从注册表QString encrypt(const QString& str);//字符串加密protected:
//用于鼠标拖动窗口的鼠标事件操作void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);public:explicit QDlgLogin(QWidget *parent = 0);~QDlgLogin();private slots:void on_btnOK_clicked(); //OK按键private:Ui::dlgLogin *ui;
};#endif // DLGLOGIN_H

cpp:
 

#include "qdlglogin.h"
#include "ui_qdlglogin.h"#include    <QMouseEvent>
#include    <QSettings>
//#include    "qwmisc.h"
#include    <QMessageBox>
#include    <QByteArray>
#include    <QCryptographicHash>void QDlgLogin::readSettings()
{//读取存储的用户名和密码, 密码是经过加密的QString organization="WWB-Qt";//用于注册表,QString appName="samp6_5"; //HKEY_CURRENT_USER/Software/WWB-Qt/amp6_5QSettings   settings(organization,appName);//创建bool saved=settings.value("saved",false).toBool();//读取 saved键的值m_user=settings.value("Username", "user").toString();//读取 Username 键的值,缺省为“user”QString defaultPSWD=encrypt("12345"); //缺省密码"12345"加密后的数据m_pswd=settings.value("PSWD",defaultPSWD).toString();//读取PSWD 键的值,if (saved)ui->editUser->setText(m_user);ui->chkBoxSave->setChecked(saved);
}void QDlgLogin::writeSettings()
{ //保存用户名,密码等设置QSettings   settings("WWB-Qt","samp6_5"); //注册表键组settings.setValue("Username",m_user); //用户名settings.setValue("PSWD",m_pswd);   //密码,经过加密的settings.setValue("saved",ui->chkBoxSave->isChecked());
}QString QDlgLogin::encrypt(const QString &str)
{ //字符串MD5算法加密QByteArray btArray;btArray.append(str);//加入原始字符串QCryptographicHash hash(QCryptographicHash::Md5);  //Md5加密算法hash.addData(btArray);  //添加数据到加密哈希值QByteArray resultArray =hash.result();  //返回最终的哈希值QString md5 =resultArray.toHex();//转换为16进制字符串return  md5;
}void QDlgLogin::mousePressEvent(QMouseEvent *event)
{ //鼠标按键被按下if (event->button() == Qt::LeftButton){m_moving = true;//记录下鼠标相对于窗口的位置//event->globalPos()鼠标按下时,鼠标相对于整个屏幕位置//pos() this->pos()鼠标按下时,窗口相对于整个屏幕位置m_lastPos = event->globalPos() - pos();}return QDialog::mousePressEvent(event);  //
}void QDlgLogin::mouseMoveEvent(QMouseEvent *event)
{//鼠标按下左键移动//(event->buttons() && Qt::LeftButton)按下是左键//鼠标移动事件需要移动窗口,窗口移动到哪里呢?就是要获取鼠标移动中,窗口在整个屏幕的坐标,然后move到这个坐标,怎么获取坐标?//通过事件event->globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗口在整个屏幕的坐标if (m_moving && (event->buttons() && Qt::LeftButton)&& (event->globalPos()-m_lastPos).manhattanLength() > QApplication::startDragDistance()){move(event->globalPos()-m_lastPos);m_lastPos = event->globalPos() - pos();}return QDialog::mouseMoveEvent(event);
}void QDlgLogin::mouseReleaseEvent(QMouseEvent *event)
{//鼠标按键释放Q_UNUSED(event);m_moving=false; //停止移动
}QDlgLogin::QDlgLogin(QWidget *parent) :QDialog(parent),ui(new Ui::dlgLogin)
{ui->setupUi(this);ui->editPSWD->setEchoMode(QLineEdit::Password); //密码输入编辑框设置为密码输入模式this->setAttribute(Qt::WA_DeleteOnClose);//设置为关闭时删除this->setWindowFlags(Qt::SplashScreen); //设置为SplashScreen, 窗口无边框,不在任务栏显示
//    this->setWindowFlags(Qt::FramelessWindowHint);//无边框,但是在任务显示对话框标题readSettings(); //读取存储的用户名和密码
}QDlgLogin::~QDlgLogin()
{
//    QMessageBox::information(this, "提示", "登录窗口被删除");delete ui;
}void QDlgLogin::on_btnOK_clicked()
{//"确定"按钮相应QString user=ui->editUser->text().trimmed();//输入用户名QString pswd=ui->editPSWD->text().trimmed(); //输入密码QString encrptPSWD=encrypt(pswd); //对输入密码进行加密if ((user==m_user)&&(encrptPSWD==m_pswd)) //如果用户名和密码正确{writeSettings();//保存设置this->accept(); //对话框 accept(),关闭对话框}else{m_tryCount++; //错误次数if (m_tryCount>3){QMessageBox::critical(this, "错误", "输入错误次数太多,强行退出");this->reject(); //退出}elseQMessageBox::warning(this, "错误提示", "用户名或密码错误");}
}

用法:

#include "qwmainwindow.h"
#include <QApplication>#include    <QPixmap>
#include    <QSplashScreen>
#include    "qdlgLogin.h"#include    <QTextCodec>int main(int argc, char *argv[])
{QTextCodec *codec = QTextCodec::codecForName("UTF-8");QTextCodec::setCodecForLocale(codec); //解决汉字乱码问题QApplication a(argc, argv);QDlgLogin   *dlgLogin=new QDlgLogin; //创建对话框if (dlgLogin->exec()==QDialog::Accepted){
//        delete dlgLogin;QWMainWindow w;w.show();return a.exec();}elsereturn  0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL进阶_5.逻辑架构和SQL执行流程

文章目录 第一节、逻辑架构剖析1.1、服务器处理客户端请求1.2、Connectors1.3、第1层&#xff1a;连接层1.4、第2层&#xff1a;服务层1.5、 第3层&#xff1a;引擎层1.6、 存储层1.7、小结 第二节、SQL执行流程2.1、查询缓存2.2、解析器2.3、优化器2.4、执行器 第三节、数据库…

GNU ld链接器 lang_process()(二)

一、ldemul_create_output_section_statements() 位于lang_process()中11行 。 该函数用于创建与目标有关的输出段的语句。这些语句将用于描述输出段的属性和分配。 void ldemul_create_output_section_statements (void) {if (ld_emulation->create_output_section_sta…

FFmpeg 硬件加速视频转码指南

基于 Windows 下演示&#xff0c;Linux 下也可以适用。 所使用 ffmpeg 版本为 BtbN 编译的 win64-gpl 版&#xff08;非 gpl-share&#xff09;&#xff0c;项目地址&#xff1a;BtbN / FFmpeg-Builds 也可以使用 gyan.dev 编译的 git-full 版&#xff0c;地址&#xff1a;gyan…

YOLO目标检测数据集大全【含voc(xml)、coco(json)和yolo(txt)三种格式标签+划分脚本+训练教程】(持续更新建议收藏)

一、作者介绍&#xff1a;资深图像算法工程师&#xff0c;YOLO算法专业玩家&#xff1b;擅长目标检测、语义分割、OCR等。 二、数据集介绍&#xff1a; 真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;分享的绝大部分数据集已应用于各种实际落地项目。所有数据…

喜讯!极限科技成功签约中国一汽搜索数据库三年许可订阅合同!

中标喜讯&#xff01;极限科技 INFINI Easysearch 成功签约中国第一汽车股份有限公司三年订阅合同&#xff01; 一汽集团作为国内汽车行业龙头企业&#xff0c;数字化转型伴随业务发展不断深化&#xff0c;非结构化数据日益成为各类组织数据的增长主力&#xff0c;逐渐成为数据…

Dubbo远程调用

分布式系统中,各个系统间远程调用的性能决定了这个分布式系统好坏 Dubbo是专门用来解决各个服务间调用的RPC框架,解决分布式系统中的远程调用问题 而Zookeeper(注册调度中心)的作用是:比如说50台用户服务器,与50台订单服务器,但是上线后发现用户服务器使用率较低,那么Zookeep…

软件测试/测试开发丨ChatGPT能否成为PPT最佳伴侣

点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中&#xff0c;无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT&#xff0c;协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等&#xff0c;可以给到观众更好…

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…

通过环境变量实现多个JDK切换

前文: 由于jdk版本需要升级为jdk17,因为jdk8比较常用且稳定,本人又不想卸载掉安装的jdk8,在经过查找资料后找到了可以通过修改环境变量在本地任意切换jdk版本 环境变量配置 网上教程一堆,直接跳过了,这里主要说明怎么通过配置环境变量切换 电脑->属性->高级系统设置-&g…

Java 多线程的线程间的协作

1. 等待与通知 为了支持多线程之间的协作&#xff0c;JDK 中提供了两个非常重要的方法&#xff1a;wait() 和 notify() &#xff0c;这两个方法定义在 Object 类中&#xff0c;这意味着任何 Java 对象都可以调用者两个方法。如果一个线程调用了 object.wait() 方法&#xff0c;…

K8s学习笔记——资源组件篇

引言 前一篇文章我们介绍了K8s的概念理解和常用命令&#xff0c;这篇我们重点介绍K8s的资源组件和相关配置使用。 1. Node & Pod Node: 是 Pod 真正运行的主机&#xff0c;可以是物理机&#xff0c;也可以是虚拟机。为了管理 Pod&#xff0c;每个 Node 节点上至少要运行…

WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…