• QT:使用多窗口做一个登录注册小项目(登录窗口、登录结果窗口、注册窗口)


    main.cpp

    1. #include "loginresult.h"
    2. #include "register.h"
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Widget w; //创建对象
    7. w.show(); //展示登录窗口
    8. LoginResult result; //创建对象
    9. Register reg;
    10. //连接主窗口的信号与登录结果窗口的槽函数
    11. //发送登录是否成功信号
    12. QObject::connect(&w,SIGNAL(enter_login_result(bool)),&result,SLOT(enter_handler(bool))); //connect是一个static(静态)函数,通过类名与作用域符调用
    13. //连接登录结果窗口的信号与登录窗口的槽函数
    14. //发送重新登录信号
    15. QObject::connect(&result,SIGNAL(re_login()),&w,SLOT(re_login_handler()));
    16. //连接登录窗口的信号与注册窗口的槽函数
    17. //跳转用户注册界面
    18. QObject::connect(&w,SIGNAL(enter_register()),®,SLOT(register_handler()));
    19. //连接注册窗口的信号与登录窗口的槽函数
    20. //注册成功发信号
    21. QObject::connect(®,SIGNAL(re_login()),&w,SLOT(re_login_handler()));
    22. return a.exec();
    23. }

    widget.h(登录窗口)

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include //模板类
    9. class Widget : public QWidget
    10. {
    11. Q_OBJECT //使用信号与槽函数
    12. public:
    13. Widget(QWidget *parent = 0);
    14. ~Widget();
    15. signals:
    16. void enter_login_result(bool result); //信号:给登录结果窗口发送登录结果
    17. void enter_register(); //信号:点击注册按钮,隐藏登录窗口
    18. private slots:
    19. void le_input_handler(); //槽函数:激活登录按钮
    20. void re_login_handler(); //槽函数:重新登录
    21. private:
    22. QLabel *lb_account,*lb_passwd; //标签:账号、密码
    23. QLineEdit *le_account,*le_passwd; //行编辑器:账号、密码
    24. QCheckBox *cb_remember,*cb_show_passwd; //复选框:记住密码、显示密码
    25. QPushButton *pb_login,*pb_register; //按钮:登录、注册
    26. };
    27. #endif // WIDGET_H

    widget.cpp

    1. #include "widget.h"
    2. #include
    3. #include
    4. #include
    5. QMap a_p_map; //容器
    6. Widget::Widget(QWidget *parent)
    7. : QWidget(parent)
    8. {
    9. setFixedSize(330,220);
    10. setWindowTitle("登录窗口");
    11. setFont(QFont("Times",10,QFont::Bold));
    12. lb_account = new QLabel("账号:",this); //创建标签
    13. le_account = new QLineEdit(this); //创建行编辑器
    14. connect(le_account,&QLineEdit::textChanged,this,&Widget::le_input_handler); //账号文本内容改变触发槽函数
    15. QHBoxLayout *hbox1 = new QHBoxLayout(); //创建水平布局管理器
    16. hbox1->addWidget(lb_account);
    17. hbox1->addWidget(le_account);
    18. lb_passwd = new QLabel("密码:",this); //创建标签
    19. le_passwd = new QLineEdit(this); //创建行编辑器
    20. le_passwd->setEchoMode(QLineEdit::Password); //设置密码回响形式
    21. connect(le_passwd,&QLineEdit::textChanged,this,&Widget::le_input_handler); //密码文本内容改变触发槽函数
    22. QHBoxLayout *hbox2 = new QHBoxLayout(); //创建水平布局管理器
    23. hbox2->addWidget(lb_passwd);
    24. hbox2->addWidget(le_passwd);
    25. cb_remember = new QCheckBox("记住密码",this); //复选框
    26. cb_show_passwd = new QCheckBox("显示密码",this); //复选框
    27. connect(cb_show_passwd,&QCheckBox::clicked,[=](){ //勾选显示密码复选框即显示密码
    28. if(cb_show_passwd->isChecked())
    29. {
    30. le_passwd->setEchoMode(QLineEdit::Normal);
    31. }
    32. else
    33. {
    34. le_passwd->setEchoMode(QLineEdit::Password);
    35. }
    36. });
    37. QHBoxLayout *hbox3 = new QHBoxLayout(); //创建水平布局管理器
    38. hbox3->addWidget(cb_remember);
    39. hbox3->addWidget(cb_show_passwd);
    40. pb_login = new QPushButton("登录",this); //创建登录按钮
    41. pb_login->setEnabled(false); //不激活功能
    42. connect(pb_login,&QPushButton::clicked,[=](){ //点击登录按钮
    43. bool result = false;
    44. if(a_p_map.contains(le_account->text()) && //检测容器中是否包含行编辑器中输入的账号
    45. a_p_map.value(le_account->text()) == le_passwd->text()) //包含则获取对应的密码,并与行编辑器中输入的密码对比是否相等
    46. {
    47. result = true;
    48. qDebug()<<"密码正确";
    49. }
    50. else
    51. {
    52. qDebug()<<"密码错误";
    53. }
    54. hide(); //是否正确都将登录窗口隐藏
    55. emit enter_login_result(result); //发送登录结果给登录结果窗口
    56. });
    57. pb_register = new QPushButton("注册",this); //创建注册按钮
    58. QHBoxLayout *hbox4 = new QHBoxLayout(); //创建水平布局管理器
    59. hbox4->addWidget(pb_login);
    60. hbox4->addWidget(pb_register);
    61. QVBoxLayout *vbox = new QVBoxLayout(); //创建垂直布局管理器
    62. vbox->addLayout(hbox1);
    63. vbox->addLayout(hbox2);
    64. vbox->addLayout(hbox3);
    65. vbox->addLayout(hbox4);
    66. setLayout(vbox); //设置整个布局
    67. a_p_map.insert("admin","admin"); //容器中插入账号、密码
    68. qDebug()<
    69. connect(pb_register,&QPushButton::clicked,[=](){ //点击注册按钮
    70. hide(); //隐藏登录窗口
    71. emit enter_register(); //发送信号
    72. });
    73. }
    74. void Widget::le_input_handler() //槽函数:是否激活登录按钮
    75. {
    76. if(le_account->text().isEmpty() || //账号或密码有一个为空则继续不激活
    77. le_passwd->text().isEmpty())
    78. {
    79. pb_login->setEnabled(false);
    80. }
    81. else //激活
    82. {
    83. pb_login->setEnabled(true);
    84. }
    85. }
    86. void Widget::re_login_handler() //槽函数:显示登录窗口
    87. {
    88. show();
    89. }
    90. Widget::~Widget()
    91. {
    92. }

    loginresult.h(登录结果窗口)

    1. #ifndef LOGINRESULT_H
    2. #define LOGINRESULT_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. class LoginResult : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. explicit LoginResult(QWidget *parent = nullptr);
    12. signals: //信号只需要声明
    13. void re_login();
    14. public slots:
    15. void enter_handler(bool result); //槽函数:根据登录结果设置登录结果窗口
    16. private:
    17. QLabel *lb; //标签:登录结果
    18. QLineEdit *le; //行编辑器
    19. QPushButton *pb_re_login,*pb_exit; //2个按钮:重新登录、关闭
    20. };
    21. #endif // LOGINRESULT_H

    loginresult.cpp

    1. #include "loginresult.h"
    2. #include
    3. #include
    4. LoginResult::LoginResult(QWidget *parent) : QWidget(parent)
    5. {
    6. setWindowTitle("登录结果窗口");
    7. setFixedSize(330,220);
    8. setFont(QFont("Times",10,QFont::Bold));
    9. lb = new QLabel("登录结果",this); //创建标签
    10. le = new QLineEdit(this); //创建行编辑器
    11. le->setReadOnly(true); //设置为只读
    12. QHBoxLayout *hbox1 = new QHBoxLayout(); //创建水平布局管理器
    13. hbox1->addWidget(lb);
    14. hbox1->addWidget(le);
    15. pb_re_login = new QPushButton("重新登录",this); //创建重新登录按钮
    16. connect(pb_re_login,&QPushButton::clicked,[=](){ //点击重新登录按钮
    17. hide(); //隐藏登录结果窗口
    18. emit re_login(); //发送信号
    19. });
    20. pb_exit = new QPushButton("关闭",this); //创建关闭按钮
    21. connect(pb_exit,&QPushButton::clicked,[=](){ //实现关闭功能
    22. close();
    23. });
    24. QHBoxLayout *hbox2 = new QHBoxLayout(); //创建水平布局管理器
    25. hbox2->addWidget(pb_re_login);
    26. hbox2->addWidget(pb_exit);
    27. QVBoxLayout *vbox = new QVBoxLayout(); //创建垂直布局管理器
    28. vbox->addLayout(hbox1);
    29. vbox->addLayout(hbox2);
    30. setLayout(vbox); //设置整个布局
    31. }
    32. void LoginResult::enter_handler(bool result) //槽函数:设置登录结果窗口
    33. {
    34. if(result) //为真
    35. {
    36. le->setText("登录成功");
    37. pb_re_login->hide(); //隐藏重新登录按钮
    38. }
    39. else
    40. {
    41. le->setText("登录失败");
    42. }
    43. show(); //显示登录结果窗口
    44. }

    register.h(用户注册窗口)

    1. #ifndef REGISTER_H
    2. #define REGISTER_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class Register : public QWidget
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit Register(QWidget *parent = nullptr);
    13. signals:
    14. void re_login(); //注册完成
    15. public slots:
    16. void register_handler(); //槽函数:显示用户注册窗口
    17. void le_name_paswd_handler(); //激活注册按钮
    18. private:
    19. QLabel *lb_title,*lb_name,*lb_passwd,*lb_re_passwd;
    20. QLineEdit *le_name,*le_passwd,*le_re_passwd;
    21. QPushButton *pb_register,*pb_exit;
    22. };
    23. #endif // REGISTER_H

    register.cpp

    1. #include "register.h"
    2. #include //水平布局
    3. #include //垂直布局
    4. #include
    5. #include
    6. extern QMap a_p_map;
    7. Register::Register(QWidget *parent) : QWidget(parent)
    8. {
    9. setWindowTitle("用户注册窗口");
    10. setFixedSize(330,220);
    11. lb_title = new QLabel("请输入您的注册信息",this); //创建标签
    12. QFont font("Times",16,QFont::Bold);
    13. lb_title->setFont(font); //设置标签字体大小
    14. lb_title->setAlignment(Qt::AlignCenter); //居中对齐
    15. lb_name = new QLabel("用户名:",this); //创建标签
    16. le_name = new QLineEdit(this); //创建行编辑器
    17. QHBoxLayout *hbox1 = new QHBoxLayout(); //创建水平布局管理器
    18. hbox1->addWidget(lb_name);
    19. hbox1->addWidget(le_name);
    20. lb_passwd = new QLabel("请输入密码:",this); //创建标签
    21. le_passwd = new QLineEdit(this); //创建行编辑器
    22. le_passwd->setEchoMode(QLineEdit::Password); //设置密码回响模式
    23. QHBoxLayout *hbox2 = new QHBoxLayout(); //创建水平布局管理器
    24. hbox2->addWidget(lb_passwd);
    25. hbox2->addWidget(le_passwd);
    26. lb_re_passwd = new QLabel("请确认密码:",this); //创建标签
    27. le_re_passwd = new QLineEdit(this); //创建行编辑器
    28. le_re_passwd->setEchoMode(QLineEdit::Password); //设置密码回响模式
    29. QHBoxLayout *hbox3 = new QHBoxLayout(); //创建水平布局管理器
    30. hbox3->addWidget(lb_re_passwd);
    31. hbox3->addWidget(le_re_passwd);
    32. pb_register = new QPushButton("注册",this); //创建按钮
    33. pb_register->setEnabled(false); //先不激活
    34. pb_exit = new QPushButton("关闭",this); //创建按钮
    35. connect(pb_exit,&QPushButton::clicked,[=](){ //实现关闭功能
    36. close();
    37. });
    38. QHBoxLayout *hbox4 = new QHBoxLayout(); //创建水平布局管理器
    39. hbox4->addWidget(pb_register);
    40. hbox4->addWidget(pb_exit);
    41. QVBoxLayout *vbox = new QVBoxLayout(); //创建垂直布局管理器
    42. vbox->addWidget(lb_title);
    43. vbox->addLayout(hbox1);
    44. vbox->addLayout(hbox2);
    45. vbox->addLayout(hbox3);
    46. vbox->addLayout(hbox4);
    47. setLayout(vbox); //设置总布局
    48. //用于激活注册按钮
    49. connect(le_name,&QLineEdit::textChanged,this,&Register::le_name_paswd_handler);
    50. connect(le_passwd,&QLineEdit::textChanged,this,&Register::le_name_paswd_handler);
    51. connect(le_re_passwd,&QLineEdit::textChanged,this,&Register::le_name_paswd_handler);
    52. connect(pb_register,&QPushButton::clicked,[=](){ //完成注册功能
    53. if(a_p_map.contains(le_name->text()))
    54. {
    55. qDebug()<<"用户名已经存在";
    56. return;
    57. }
    58. if(le_passwd->text() != le_re_passwd->text())
    59. {
    60. qDebug()<<"两次输入的密码不一致";
    61. return;
    62. }
    63. a_p_map.insert(le_name->text(),le_passwd->text()); //插入注册信息
    64. qDebug()<//打印所有注册信息
    65. hide(); //注册成功后隐藏用户注册窗口
    66. emit re_login(); //发送信号给登录窗口
    67. });
    68. }
    69. void Register::register_handler() //槽函数:注册
    70. {
    71. show(); //显示用户注册窗口
    72. }
    73. void Register::le_name_paswd_handler() //激活注册按钮
    74. {
    75. if(le_name->text().isEmpty() ||
    76. le_passwd->text().isEmpty() ||
    77. le_re_passwd->text().isEmpty())
    78. {
    79. pb_register->setEnabled(false);
    80. }
    81. else
    82. {
    83. pb_register->setEnabled(true);
    84. }
    85. }

    结果

  • 相关阅读:
    66 内网安全-域横向批量at&schtasks&impacket
    SpringCloud Stream详解
    【CMU15-445 Part-8】Tree Indexes ii
    17.12 windows临界区、其他各种mutex互斥量
    C++重载运算符的规则
    MFC扩展库BCGControlBar Pro v35.0新版亮点:重新设计的工具栏编辑器等
    Pyhton 裁剪视频尺寸 脚本
    含氯甲基大孔径苯乙烯-二乙烯基苯微球/交联聚苯乙烯微球固载双齿席夫碱型氧钒(Ⅳ)
    Android processgroup机制
    知识图谱-KGE-模型:概述
  • 原文地址:https://blog.csdn.net/cxy255256/article/details/132994972