• Qt登录界面


    头文件

    1. #ifndef QDLGLOGIN_H
    2. #define QDLGLOGIN_H
    3. #include
    4. namespace Ui {
    5. class dlgLogin;
    6. }
    7. class QDlgLogin : public QDialog
    8. {
    9. Q_OBJECT
    10. private:
    11. bool m_moving=false;//表示窗口是否在鼠标操作下移动
    12. QPoint m_lastPos; //上一次的鼠标位置
    13. QString m_user="user"; //初始化用户名
    14. QString m_pswd="12345";//初始化密码,未加密的
    15. int m_tryCount=0; //试错次数
    16. void readSettings(); //读取设置,从注册表
    17. void writeSettings();//写入设置,从注册表
    18. QString encrypt(const QString& str);//字符串加密
    19. protected:
    20. //用于鼠标拖动窗口的鼠标事件操作
    21. void mousePressEvent(QMouseEvent *event);
    22. void mouseMoveEvent(QMouseEvent *event);
    23. void mouseReleaseEvent(QMouseEvent *event);
    24. public:
    25. explicit QDlgLogin(QWidget *parent = 0);
    26. ~QDlgLogin();
    27. private slots:
    28. void on_btnOK_clicked(); //OK按键
    29. private:
    30. Ui::dlgLogin *ui;
    31. };
    32. #endif // DLGLOGIN_H

    cpp
     

    1. #include "qdlglogin.h"
    2. #include "ui_qdlglogin.h"
    3. #include
    4. #include
    5. //#include "qwmisc.h"
    6. #include
    7. #include
    8. #include
    9. void QDlgLogin::readSettings()
    10. {//读取存储的用户名和密码, 密码是经过加密的
    11. QString organization="WWB-Qt";//用于注册表,
    12. QString appName="samp6_5"; //HKEY_CURRENT_USER/Software/WWB-Qt/amp6_5
    13. QSettings settings(organization,appName);//创建
    14. bool saved=settings.value("saved",false).toBool();//读取 saved键的值
    15. m_user=settings.value("Username", "user").toString();//读取 Username 键的值,缺省为“user”
    16. QString defaultPSWD=encrypt("12345"); //缺省密码"12345"加密后的数据
    17. m_pswd=settings.value("PSWD",defaultPSWD).toString();//读取PSWD 键的值,
    18. if (saved)
    19. ui->editUser->setText(m_user);
    20. ui->chkBoxSave->setChecked(saved);
    21. }
    22. void QDlgLogin::writeSettings()
    23. { //保存用户名,密码等设置
    24. QSettings settings("WWB-Qt","samp6_5"); //注册表键组
    25. settings.setValue("Username",m_user); //用户名
    26. settings.setValue("PSWD",m_pswd); //密码,经过加密的
    27. settings.setValue("saved",ui->chkBoxSave->isChecked());
    28. }
    29. QString QDlgLogin::encrypt(const QString &str)
    30. { //字符串MD5算法加密
    31. QByteArray btArray;
    32. btArray.append(str);//加入原始字符串
    33. QCryptographicHash hash(QCryptographicHash::Md5); //Md5加密算法
    34. hash.addData(btArray); //添加数据到加密哈希值
    35. QByteArray resultArray =hash.result(); //返回最终的哈希值
    36. QString md5 =resultArray.toHex();//转换为16进制字符串
    37. return md5;
    38. }
    39. void QDlgLogin::mousePressEvent(QMouseEvent *event)
    40. { //鼠标按键被按下
    41. if (event->button() == Qt::LeftButton)
    42. {
    43. m_moving = true;
    44. //记录下鼠标相对于窗口的位置
    45. //event->globalPos()鼠标按下时,鼠标相对于整个屏幕位置
    46. //pos() this->pos()鼠标按下时,窗口相对于整个屏幕位置
    47. m_lastPos = event->globalPos() - pos();
    48. }
    49. return QDialog::mousePressEvent(event); //
    50. }
    51. void QDlgLogin::mouseMoveEvent(QMouseEvent *event)
    52. {//鼠标按下左键移动
    53. //(event->buttons() && Qt::LeftButton)按下是左键
    54. //鼠标移动事件需要移动窗口,窗口移动到哪里呢?就是要获取鼠标移动中,窗口在整个屏幕的坐标,然后move到这个坐标,怎么获取坐标?
    55. //通过事件event->globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗口在整个屏幕的坐标
    56. if (m_moving && (event->buttons() && Qt::LeftButton)
    57. && (event->globalPos()-m_lastPos).manhattanLength() > QApplication::startDragDistance())
    58. {
    59. move(event->globalPos()-m_lastPos);
    60. m_lastPos = event->globalPos() - pos();
    61. }
    62. return QDialog::mouseMoveEvent(event);
    63. }
    64. void QDlgLogin::mouseReleaseEvent(QMouseEvent *event)
    65. {//鼠标按键释放
    66. Q_UNUSED(event);
    67. m_moving=false; //停止移动
    68. }
    69. QDlgLogin::QDlgLogin(QWidget *parent) :
    70. QDialog(parent),
    71. ui(new Ui::dlgLogin)
    72. {
    73. ui->setupUi(this);
    74. ui->editPSWD->setEchoMode(QLineEdit::Password); //密码输入编辑框设置为密码输入模式
    75. this->setAttribute(Qt::WA_DeleteOnClose);//设置为关闭时删除
    76. this->setWindowFlags(Qt::SplashScreen); //设置为SplashScreen, 窗口无边框,不在任务栏显示
    77. // this->setWindowFlags(Qt::FramelessWindowHint);//无边框,但是在任务显示对话框标题
    78. readSettings(); //读取存储的用户名和密码
    79. }
    80. QDlgLogin::~QDlgLogin()
    81. {
    82. // QMessageBox::information(this, "提示", "登录窗口被删除");
    83. delete ui;
    84. }
    85. void QDlgLogin::on_btnOK_clicked()
    86. {//"确定"按钮相应
    87. QString user=ui->editUser->text().trimmed();//输入用户名
    88. QString pswd=ui->editPSWD->text().trimmed(); //输入密码
    89. QString encrptPSWD=encrypt(pswd); //对输入密码进行加密
    90. if ((user==m_user)&&(encrptPSWD==m_pswd)) //如果用户名和密码正确
    91. {
    92. writeSettings();//保存设置
    93. this->accept(); //对话框 accept(),关闭对话框
    94. }
    95. else
    96. {
    97. m_tryCount++; //错误次数
    98. if (m_tryCount>3)
    99. {
    100. QMessageBox::critical(this, "错误", "输入错误次数太多,强行退出");
    101. this->reject(); //退出
    102. }
    103. else
    104. QMessageBox::warning(this, "错误提示", "用户名或密码错误");
    105. }
    106. }

    用法

    1. #include "qwmainwindow.h"
    2. #include
    3. #include
    4. #include
    5. #include "qdlgLogin.h"
    6. #include
    7. int main(int argc, char *argv[])
    8. {
    9. QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    10. QTextCodec::setCodecForLocale(codec); //解决汉字乱码问题
    11. QApplication a(argc, argv);
    12. QDlgLogin *dlgLogin=new QDlgLogin; //创建对话框
    13. if (dlgLogin->exec()==QDialog::Accepted)
    14. {
    15. // delete dlgLogin;
    16. QWMainWindow w;
    17. w.show();
    18. return a.exec();
    19. }
    20. else
    21. return 0;
    22. }

    简易版本:

    1. #include "dialog.h"
    2. #include "mainwidget.h"
    3. #include
    4. int main(int argc, char *argv[])
    5. {
    6. QApplication a(argc, argv);
    7. Dialog w;
    8. if(w.exec() == QDialog::Accepted)
    9. {
    10. MainWidget m;
    11. m.show();
    12. return a.exec();
    13. }
    14. return 0;
    15. }
    1. void Dialog::on_pushButton_clicked()
    2. {
    3. if(ui->lineEdit->text() == "lhq" && ui->lineEdit_2->text() == "123")
    4. {
    5. accept();
    6. }
    7. }

  • 相关阅读:
    神经网络模型的工作原理,神经网络模型应用实例
    Python使用opencv基于坐标范围批量剪裁(图像)并将剪裁后的图像保存到指定的新文件夹中
    Typecho框架漏洞
    Redis-缓存穿透,缓存击穿,缓存雪崩
    React: 如何保证中断之后的状态?
    凡尔码安全巡检卡替代传统纸质记录卡
    网络安全工程师薪资到底怎么样?_网络安全薪水一般多少
    没有可用软件包和yum源问题
    Android加固为何重要?很多人不学
    Raid 独立磁盘冗余阵列
  • 原文地址:https://blog.csdn.net/weixin_38241876/article/details/134235806