• Cpp/Qt-day050921Qt


    目录

    实现使用数据库的登录注册功能

    头文件:

    registrwidget.h:

    widget.h:

    源文件:

    registrwidget.c:

    widget.h:

    效果图:

    思维导图


    实现使用数据库的登录注册功能
    头文件:
    registrwidget.h:
    1. #ifndef REGISTRWIDGET_H
    2. #define REGISTRWIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include //数据库管理类
    9. #include //执行sql语句的类
    10. #include //记录数据库记录的类
    11. namespace Ui {
    12. class registrwidget;
    13. }
    14. class registrwidget : public QWidget
    15. {
    16. Q_OBJECT
    17. public slots:
    18. void jumpToRegister_slot();
    19. public:
    20. explicit registrwidget(QWidget *parent = nullptr);
    21. ~registrwidget();
    22. // void jumpToWid();
    23. void cancel_btn_clicked_slot();
    24. void register_btn_clicked_slot();
    25. private:
    26. Ui::registrwidget *ui;
    27. QPushButton *register_btn;
    28. QPushButton *cancel_btn;
    29. QLabel *lab1;
    30. QLineEdit *edit1;
    31. QLineEdit *edit2;
    32. QLineEdit *edit3;
    33. QLabel *lab2;
    34. QLabel *lab3;
    35. QLabel *lab4;
    36. QSqlDatabase db; //定义一个数据库的类对象
    37. //Widget *wid;
    38. };
    39. #endif // REGISTRWIDGET_H
    widget.h:
    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include "registrwidget.h"
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include //数据库管理类
    11. #include //执行sql语句的类
    12. #include //记录数据库记录的类
    13. QT_BEGIN_NAMESPACE
    14. namespace Ui { class Widget; }
    15. QT_END_NAMESPACE
    16. class Widget : public QWidget
    17. {
    18. Q_OBJECT
    19. public:
    20. Widget(QWidget *parent = nullptr);
    21. ~Widget();
    22. signals:
    23. //void jumpToLogin();
    24. void jumpToRegister();
    25. public slots:
    26. void loginBtn_slot();
    27. void cancelBtn_slot();
    28. void registerBtn_slot();
    29. private:
    30. Ui::Widget *ui;
    31. QLabel *lab1;
    32. QLineEdit *edit1;
    33. QLineEdit *edit2;
    34. QLabel *lab2;
    35. QLabel *lab3;
    36. QPushButton *btn1;
    37. QPushButton *btn2;
    38. QPushButton *btn3;
    39. QSqlDatabase db; //定义一个数据库的类对象
    40. //login *l1;
    41. registrwidget *reg_wid;
    42. };
    43. #endif // WIDGET_H
    源文件:
    registrwidget.c:
    1. #include "registrwidget.h"
    2. #include "ui_registrwidget.h"
    3. void registrwidget::jumpToRegister_slot()
    4. {
    5. this->show(); //展示自己的界面
    6. }
    7. registrwidget::registrwidget(QWidget *parent) :
    8. QWidget(parent),
    9. ui(new Ui::registrwidget)
    10. {
    11. ui->setupUi(this);
    12. //判断自己的数据库对象中是否包含了要处理的数据库,如果没有就添加,如果包含就打开
    13. if(!db.contains("registeredusr.db")){
    14. //添加一个数据库
    15. db = QSqlDatabase::addDatabase("QSQLITE");
    16. //设置数据库的名字
    17. db.setDatabaseName("registeredusr.db");
    18. }
    19. //此时已经有一个名为registeredusr.db的数据库
    20. //打开数据库
    21. if(!db.open()){
    22. QMessageBox::critical(this, "失败", "打开失败");
    23. return;
    24. }
    25. //说明数据库打开成功
    26. //需要使用sql语句进行创建表的操作
    27. //准备sql语句
    28. QString sql("create table if not exists regedusr(" //创建表
    29. "usrname varchar(20) primary key," //账号
    30. "passwd varchar(20))"); //密码
    31. //准备语句执行者
    32. QSqlQuery query;
    33. //让语句执行者执行sql语句
    34. if(!query.exec(sql)){
    35. QMessageBox::critical(this, "失败", "创建失败");
    36. return;
    37. }
    38. //将图形化界面的名字改成Login screen(登录界面)
    39. this->setWindowTitle("Register screen");
    40. //将ui的图标改成想要的
    41. this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));
    42. //设置ui界面的大小为合适的大小
    43. this->setFixedSize(QSize(400,300));
    44. //插入一个label,它的宽度与ui等宽,高度大约为整个ui界面高度的4/9
    45. lab1 = new QLabel(this);
    46. lab1->resize(QSize(400,133));
    47. lab1->move(0,0);
    48. //label的内容要是一张图片
    49. lab1->setPixmap(QPixmap(":/icon/logo.png"));
    50. //设置图片填充
    51. lab1->setScaledContents(true);
    52. //插入两个行编辑器,第一个用于输入账号
    53. edit1 = new QLineEdit(this);
    54. edit1->resize(QSize(240,30));
    55. edit1->move(110,145);
    56. edit1->setPlaceholderText("账号");
    57. //第二个用于输入密码
    58. edit2 = new QLineEdit(this);
    59. edit2->resize(QSize(240,30));
    60. edit2->move(edit1->x(),edit1->y()+35);
    61. edit2->setPlaceholderText("密码");
    62. //第二个回显模式是密码模式
    63. edit2->setEchoMode(QLineEdit::Password);
    64. //第三个用于确认密码
    65. edit3 = new QLineEdit(this);
    66. edit3->resize(QSize(240,30));
    67. edit3->move(edit1->x(),edit2->y()+35);
    68. edit3->setPlaceholderText("请确认密码");
    69. //第三个回显模式也是密码模式
    70. edit3->setEchoMode(QLineEdit::Password);
    71. //每个行编辑器前都要有一个label,内容为图片
    72. lab2 = new QLabel(this);
    73. lab2->resize(37,30);
    74. lab2->setPixmap(QPixmap(":/icon/userName.jpg"));
    75. lab2->setScaledContents(true);
    76. lab2->move(edit1->x()-60,edit1->y());
    77. lab3 = new QLabel(this);
    78. lab3->resize(37,30);
    79. lab3->setPixmap(QPixmap(":/icon/passwd.jpg"));
    80. lab3->setScaledContents(true);
    81. lab3->move(edit2->x()-60,edit2->y());
    82. lab4 = new QLabel(this);
    83. lab4->resize(37,30);
    84. lab4->setPixmap(QPixmap(":/icon/passwd.jpg"));
    85. lab4->setScaledContents(true);
    86. lab4->move(edit3->x()-60,edit3->y());
    87. //实例化登录按钮和退出按钮
    88. register_btn = new QPushButton("注册", this);
    89. cancel_btn = new QPushButton("取消", this);
    90. register_btn->resize(60,30);
    91. cancel_btn->resize(60,30);
    92. register_btn->move(120, edit3->y()+45);
    93. cancel_btn->move(register_btn->x()+120, register_btn->y());
    94. //将取消按钮的按下信号与对应的槽函数连接,点击取消就关闭注册界面
    95. connect(cancel_btn, &QPushButton::clicked, this, ®istrwidget::cancel_btn_clicked_slot);
    96. //将注册按钮的按下信号与对应的槽函数连接,点击注册就进行对应的操作
    97. connect(register_btn, &QPushButton::clicked, this, ®istrwidget::register_btn_clicked_slot);
    98. }
    99. registrwidget::~registrwidget()
    100. {
    101. delete ui;
    102. }
    103. void registrwidget::cancel_btn_clicked_slot()
    104. {
    105. //使用静态成员函数的方式打开一个对话框
    106. int ret = QMessageBox::question(this,
    107. "取消",
    108. "是否确认取消注册",
    109. QMessageBox::Yes|QMessageBox::No,
    110. QMessageBox::No);
    111. switch (ret) {
    112. case QMessageBox::Yes://确认就退出
    113. this->close();
    114. break;
    115. case QMessageBox::No://否就不进行任何操作
    116. break;
    117. default://应该不会有这种可能性
    118. break;
    119. }
    120. }
    121. void registrwidget::register_btn_clicked_slot()
    122. {
    123. QString usrname = edit1->text();
    124. QString passwd = edit2->text();
    125. QString repasswd = edit3->text();
    126. //确保每个容器中都有数据
    127. if(usrname.isEmpty() ||passwd.isEmpty() || repasswd.isEmpty()){
    128. QMessageBox::warning(this, "警告", "请将信息填写完整");
    129. return;
    130. }
    131. //判断,如果两个密码输入框中的密码不同,就给出消息框提示,并清空密码框
    132. if(passwd != repasswd){
    133. QMessageBox::critical(this, "错误", "请确保两次密码都输入正确");
    134. edit2->clear();
    135. edit3->clear();
    136. return;
    137. }
    138. //此时,容器中都有数据,且确认密码正确,判断用户名是否存在
    139. //准备sql语句
    140. QString sql = QString("select passwd from regedusr where usrname='%1';").arg(usrname);
    141. //准备语句执行者
    142. QSqlQuery query;
    143. //让语句执行者执行sql语句
    144. if(!query.exec(sql)){
    145. QMessageBox::critical(this, "失败", "注册失败");
    146. return;
    147. }
    148. if(query.next()){
    149. QMessageBox::critical(this, "失败", "用户名已存在");
    150. return;
    151. }
    152. //此时可以进行插入操作
    153. //准备sql语句
    154. sql = QString("insert into regedusr(usrname, passwd)"
    155. "values('%1', '%2')").arg(usrname).arg(passwd);
    156. //让语句执行者执行sql语句
    157. if(!query.exec(sql)){
    158. QMessageBox::critical(this, "失败", "注册失败");
    159. return;
    160. }
    161. //此时注册成功
    162. QMessageBox::information(this, "成功", "注册成功");
    163. //注册成功后自动退出注册界面
    164. this->close();
    165. }
    widget.h:
    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. reg_wid = new registrwidget;
    9. //判断自己的数据库对象中是否包含了要处理的数据库,如果没有就添加,如果包含就打开
    10. if(!db.contains("registeredusr.db")){
    11. //添加一个数据库
    12. db = QSqlDatabase::addDatabase("QSQLITE");
    13. //设置数据库的名字
    14. db.setDatabaseName("registeredusr.db");
    15. }
    16. //此时已经有一个名为registeredusr.db的数据库
    17. //打开数据库
    18. if(!db.open()){
    19. QMessageBox::critical(this, "失败", "打开失败");
    20. return;
    21. }
    22. //说明数据库打开成功
    23. //需要使用sql语句进行创建表的操作
    24. //准备sql语句
    25. QString sql("create table if not exists regedusr(" //创建表
    26. "usrname varchar(20) primary key," //账号
    27. "passwd varchar(20))"); //密码
    28. //准备语句执行者
    29. QSqlQuery query;
    30. //让语句执行者执行sql语句
    31. if(!query.exec(sql)){
    32. QMessageBox::critical(this, "失败", "创建失败");
    33. return;
    34. }
    35. //将图形化界面的名字改成Login screen(登录界面)
    36. this->setWindowTitle("Login screen");
    37. //将ui的图标改成想要的
    38. this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));
    39. //设置ui界面的大小为合适的大小
    40. this->setFixedSize(QSize(400,300));
    41. //插入一个label,它的宽度与ui等宽,高度大约为整个ui界面高度的4/9
    42. lab1 = new QLabel(this);
    43. lab1->resize(QSize(400,133));
    44. lab1->move(0,0);
    45. //label的内容要是一张图片
    46. lab1->setPixmap(QPixmap(":/icon/logo.png"));
    47. //设置图片填充
    48. lab1->setScaledContents(true);
    49. //插入两个行编辑器,第一个用于输入账号
    50. edit1 = new QLineEdit(this);
    51. edit1->resize(QSize(240,40));
    52. edit1->move(110,150);
    53. edit1->setPlaceholderText("账号");
    54. //第二个用于输入密码
    55. edit2 = new QLineEdit(this);
    56. edit2->resize(QSize(240,40));
    57. edit2->move(edit1->x(),edit1->y()+55);
    58. edit2->setPlaceholderText("密码");
    59. //第二个回显模式是密码模式
    60. edit2->setEchoMode(QLineEdit::Password);
    61. //每个行编辑器前都要有一个label,内容为图片
    62. lab2 = new QLabel(this);
    63. lab2->resize(50,40);
    64. lab2->setPixmap(QPixmap(":/icon/userName.jpg"));
    65. lab2->setScaledContents(true);
    66. lab2->move(edit1->x()-60,edit1->y());
    67. lab3 = new QLabel(this);
    68. lab3->resize(50,40);
    69. lab3->setPixmap(QPixmap(":/icon/passwd.jpg"));
    70. lab3->setScaledContents(true);
    71. lab3->move(edit2->x()-60,edit2->y());
    72. //要有两个pushbutton,一个是登录另一个是取消
    73. btn1 = new QPushButton("登录",this);
    74. btn2 = new QPushButton("取消",this);
    75. //重设他们的尺寸
    76. btn1->resize(QSize(60,30));
    77. btn2->resize(btn1->size());
    78. //移动他们的位置到合适
    79. btn1->move(170,edit2->y()+55);
    80. btn2->move(270,edit2->y()+55);
    81. //内容都会有一个图片
    82. btn1->setIcon(QIcon(":/icon/login.png"));
    83. btn2->setIcon(QIcon(":/icon/cancel.png"));
    84. //实例化一个注册按钮
    85. btn3 = new QPushButton("注册", this);
    86. btn3->resize(btn1->size());
    87. //移动到一个合适的位置
    88. btn3->move(btn1->x()-100,btn1->y());
    89. //将登录按钮点击发信号与处理函数连接
    90. connect(this->btn1, &QPushButton::clicked, this, &Widget::loginBtn_slot);
    91. //将取消按钮点击发信号与处理函数连接
    92. connect(this->btn2, &QPushButton::clicked, this, &Widget::cancelBtn_slot);
    93. //将跳转信号与registrwidget界面的处理函数连接
    94. connect(this, &Widget::jumpToRegister, reg_wid, ®istrwidget::jumpToRegister_slot);
    95. //将注册按钮点击信号与跳转向注册界面的信号连接,点击注册按钮自动跳转到注册界面
    96. connect(this->btn3, &QPushButton::clicked, this, &Widget::registerBtn_slot);
    97. }
    98. Widget::~Widget()
    99. {
    100. delete ui;
    101. }
    102. void Widget::loginBtn_slot()
    103. {
    104. QString usrname = edit1->text();
    105. QString passwd = edit2->text();
    106. //准备sql语句
    107. //按照用户名查找密码项
    108. QString sql = QString("select passwd from regedusr where usrname='%1';").arg(usrname);
    109. //准备语句执行者
    110. QSqlQuery query;
    111. //让语句执行者执行sql语句
    112. if(!query.exec(sql)){
    113. QMessageBox::critical(this, "失败", "登录失败");
    114. return;
    115. }
    116. if(!query.next()){
    117. QMessageBox::critical(this, "登录失败", "用户名不存在,请先注册");
    118. edit2->clear();
    119. return;
    120. }else{
    121. //此时,数据表中对应的用户名是存在对应密码的
    122. if(passwd == query.value(0).toString()){
    123. //对象版实现打开一个信息对话框
    124. QMessageBox box(QMessageBox::Information,
    125. "登录成功",
    126. "登录成功",
    127. QMessageBox::Ok,
    128. this);
    129. box.exec();
    130. }else{
    131. //对象版实现打开一个错误对话框
    132. QMessageBox box(QMessageBox::Critical,
    133. "错误",
    134. "账号密码不匹配,是否重新登录",
    135. QMessageBox::Ok|QMessageBox::Cancel,
    136. this);
    137. //设置默认选择的按钮
    138. box.setDefaultButton(QMessageBox::Ok);
    139. int ret = box.exec();
    140. //有两个按钮,需要判断
    141. if(QMessageBox::Ok==ret){
    142. edit2->clear();
    143. }else{
    144. this->close();
    145. }
    146. }
    147. }
    148. }
    149. void Widget::cancelBtn_slot()
    150. {
    151. //使用静态成员函数的方式打开一个对话框
    152. int ret = QMessageBox::question(this,
    153. "请问",
    154. "是否确认要退出",
    155. QMessageBox::Yes|QMessageBox::No,
    156. QMessageBox::No);
    157. switch (ret) {
    158. case QMessageBox::Yes://确认就退出
    159. this->close();
    160. break;
    161. case QMessageBox::No://否就不进行任何操作
    162. break;
    163. default://应该不会有这种可能性
    164. break;
    165. }
    166. }
    167. void Widget::registerBtn_slot()
    168. {
    169. emit jumpToRegister();
    170. }
    效果图:
    使用一个未注册的账户进行登录:

    点击注册:

    如果用户名已注册:

    正确输入账号和密码:

    注册成功后登录的效果:

    如果登录的时候密码错误:

    思维导图

  • 相关阅读:
    基于Apache Doris数仓平台架构设计
    软件工程概述----- Scrum敏捷开发
    代码随想录算法训练营第20天|二叉树
    游程编码(Run Length Coding)
    请问我的电脑这是怎么了
    SnakeYaml的不出网反序列化利用分析
    I/O 模型解析
    使用Nginx和uwsgi在自己的服务器上部署python的flask项目
    1.http和https
    服务器数据恢复-EMC存储磁盘损坏的RAID5数据恢复案例
  • 原文地址:https://blog.csdn.net/sy311SB/article/details/133149178