• QT Day5


    目录

    1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息

    widget.h

    widget.cpp

    second.h

    second.cpp

    2.思维导图


    1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include"second.h"
    11. #include //数据库管理类
    12. #include //执行sql语句的类
    13. #include //数据库记录的类
    14. QT_BEGIN_NAMESPACE
    15. namespace Ui { class Widget; }
    16. QT_END_NAMESPACE
    17. class Widget : public QWidget
    18. {
    19. Q_OBJECT
    20. signals: //该权限下定义属于自己的信号
    21. void my_signal(); //自定义一个无参无返回值的信号函数
    22. void jump(); //自定义跳转的信号函数;
    23. private slots:
    24. void my_slot(); //自定义无参无返回值的槽函数
    25. void my_slot1();
    26. void my_slot3();
    27. public:
    28. Widget(QWidget *parent = nullptr);
    29. ~Widget();
    30. private:
    31. Ui::Widget *ui;
    32. QLabel* lab1;
    33. QLabel* lab2;
    34. QLabel* lab3;
    35. QLineEdit* edit1;
    36. QLineEdit* edit2;
    37. QPushButton *btn1;
    38. QPushButton *btn2;
    39. QPushButton *btn3;
    40. void on_quesBtn_clicked();
    41. void on_critBtn_clicked();
    42. void on_infoBtn_clicked();
    43. QSqlDatabase db; //定义一个数据库的类对象
    44. };
    45. #endif // WIDGET_H

    widget.cpp

    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. this->setFixedSize(800,600); //设置固定尺寸
    9. this->setWindowTitle("Widget"); //设置窗口标题
    10. this->setWindowIcon(QIcon(":/wodepeizhenshi.png")); //设置窗口图标
    11. //实例化标签
    12. lab1=new QLabel(this);
    13. lab1->setPixmap(QPixmap("D:\\qt23062\\day8\\logo.png")); //设置图片
    14. lab1->setScaledContents(true); //设置图片自动适应大小
    15. lab1->resize(800,270); //重新设置尺寸
    16. //标签2
    17. lab2=new QLabel(this);
    18. lab2->setPixmap(QPixmap(":/userName.jpg")); //设置图片
    19. lab2->setScaledContents(true); //设置图片自动适应大小
    20. lab2->resize(60,60); //重新设置尺寸
    21. lab2->move(200,300);
    22. //标签3
    23. lab3=new QLabel(this);
    24. lab3->setPixmap(QPixmap(":/passwd.jpg")); //设置图片
    25. lab3->setScaledContents(true); //设置图片自动适应大小
    26. lab3->resize(60,60); //重新设置尺寸
    27. lab3->move(lab2->x(),lab2->y()+90);
    28. //行编辑器
    29. edit1=new QLineEdit("",this);
    30. edit1->setPlaceholderText("账号");
    31. edit1->move(lab2->x()+75,lab2->y());
    32. edit1->resize(360,60);
    33. edit2=new QLineEdit("",this);
    34. edit2->setPlaceholderText("密码");
    35. edit2->move(lab3->x()+75,lab3->y());
    36. edit2->resize(360,60);
    37. edit2->setEchoMode(QLineEdit::Password); //设置回显模式
    38. //按钮
    39. btn1=new QPushButton(QIcon(":/login.png"),"登录",this);
    40. btn1->move(edit2->x()+50,edit2->y()+100);
    41. btn1->resize(110,70); //重新设置尺寸
    42. QFont font = btn1->font();
    43. font.setPointSize(16); // 设置字体大小为16像素
    44. btn1->setFont(font);
    45. QPushButton *btn2=new QPushButton(QIcon(":/cancel.png"),"取消",this);
    46. btn2->move(btn1->x()+150,btn1->y());
    47. btn2->resize(110,70); //重新设置尺寸
    48. QFont font1 = btn2->font();
    49. font1.setPointSize(16); // 设置字体大小为16像素
    50. btn2->setFont(font1);
    51. btn3=new QPushButton("注册",this);
    52. btn3->move(btn1->x()-150,btn1->y());
    53. btn3->resize(110,70);
    54. QFont font2 = btn3->font();
    55. font2.setPointSize(16); // 设置字体大小为16像素
    56. btn3->setFont(font2);
    57. //连接
    58. connect(btn3, &QPushButton::clicked, this, &Widget::my_slot3);
    59. connect(btn1, &QPushButton::clicked, this, &Widget::my_slot);
    60. connect(btn2, &QPushButton::clicked, this, &Widget::my_slot1);
    61. connect(this,&Widget::my_signal,this,&Widget::close);
    62. //判断自己的数据库对象中,是否包含了要处理的数据库,如果没有包含,则添加一个数据库,如果包含了,就可以打开了
    63. if(!db.contains("mydatabase.db"))
    64. {
    65. //添加一个数据库,调用该类中的静态成员函数
    66. //函数原型 static QSqlDatabase addDatabase(const QString& type)
    67. db=QSqlDatabase::addDatabase("QSQLITE");
    68. //设置数据库的名字
    69. db.setDatabaseName("mydatabase.db");
    70. }
    71. //此时已经有一个名为mydatabase.db的数据库
    72. //打开数据库
    73. if(!db.open())
    74. {
    75. QMessageBox::information(this,"失败","数据库打开失败");
    76. return;
    77. }
    78. //需要使用sql语句进行创建表的操作
    79. //准备sql语句
    80. QString sql="create table if not exists id (" //创建表
    81. "acc varchar(20) primary key," //账号,主键
    82. "pas varchar20)"; //密码
    83. //准备语句执行着
    84. QSqlQuery querry;
    85. //让语句执行者执行sql语句
    86. //返回值bool类型
    87. if(!querry.exec(sql))
    88. {
    89. QMessageBox::information(this,"失败","创建表失败");
    90. return;
    91. }
    92. }
    93. Widget::~Widget()
    94. {
    95. delete ui;
    96. }
    97. //槽函数
    98. void Widget::my_slot()
    99. {
    100. QString sql="select * from id";
    101. QSqlQuery querry;
    102. if(!querry.exec(sql))
    103. {
    104. QMessageBox::information(this,"提示","系统错误");
    105. return ;
    106. }
    107. int flag=0;
    108. while(querry.next())
    109. {
    110. if(edit1->text()==querry.record().value(0).toString()&&querry.record().value(1).toString()==edit2->text())
    111. {
    112. on_infoBtn_clicked(); //登入成功函数
    113. flag=1;
    114. break;
    115. }
    116. }
    117. if(0==flag)
    118. {
    119. //错误对话框
    120. on_critBtn_clicked();
    121. }
    122. }
    123. void Widget::my_slot1()
    124. {
    125. //问题对话框
    126. on_quesBtn_clicked();
    127. }
    128. void Widget::my_slot3()
    129. {
    130. //注册数据
    131. //获取ui界面中要录入的数据
    132. QString acc=edit1->text(); //账号
    133. QString pas=edit2->text(); //密码
    134. //确保每个编辑器中都有数据
    135. if(acc.isEmpty()||pas.isEmpty())
    136. {
    137. QMessageBox::information(this,"提示","请将信息填写完整");
    138. return;
    139. }
    140. //准备sql语句
    141. QString sql=QString("insert into id(acc,pas)"
    142. "values('%1','%2')").arg(acc).arg(pas);
    143. // qDebug()<
    144. //准备语句执行者
    145. QSqlQuery querry;
    146. if(!querry.exec(sql))
    147. {
    148. QMessageBox::information(this,"失败","注册失败");
    149. return ;
    150. }else
    151. {
    152. QMessageBox::information(this,"成功","注册成功");
    153. }
    154. }
    155. //问题对话框
    156. void Widget::on_quesBtn_clicked()
    157. {
    158. //1.调用构造函数实例化对象
    159. QMessageBox box(QMessageBox::Question, //图标
    160. "问题对话框", //对话框标题
    161. "是否确定要退出登入", //对话框文本内容
    162. QMessageBox::Yes|QMessageBox::No, //提供的按钮
    163. this); //父组件
    164. //box.setDetailedText("有上好的飞天茅台"); //提供详细文本内容
    165. //box.setDefaultButton(QMessageBox::No); //将no设置成默认按钮
    166. //2.调用exec函数运行对话框
    167. int ret=box.exec();
    168. //3.对结果进行判断
    169. if(ret==QMessageBox::Yes)
    170. {
    171. emit my_signal();
    172. }else if(ret==QMessageBox::No)
    173. {
    174. }
    175. }
    176. //信息对话框
    177. void Widget::on_infoBtn_clicked()
    178. {
    179. //直接调用静态成员函数完成对话框的实现
    180. int ret=QMessageBox::information(this, //父组件
    181. "信息对话框", //对话框标题
    182. "登入成功", //对话框文本内容
    183. QMessageBox::Ok, //对话框提供的按钮
    184. QMessageBox::Ok); //默认选中的按钮
    185. if (ret==QMessageBox::Ok)
    186. {
    187. emit my_signal();
    188. emit jump();
    189. }
    190. }
    191. //错误对话框
    192. void Widget::on_critBtn_clicked()
    193. {
    194. //1.调用构造函数实例化对象
    195. QMessageBox box(QMessageBox::Critical, //图标
    196. "错误对话框", //对话框标题
    197. "账号密码不匹配,是否重新登入", //对话框文本内容
    198. QMessageBox::Yes|QMessageBox::No, //提供的按钮
    199. this); //父组件
    200. //box.setDetailedText("账号密码不匹配,是否重新登入"); //提供详细文本内容
    201. //box.setDefaultButton(QMessageBox::No); //将no设置成默认按钮
    202. box.setButtonText(QMessageBox::Yes,"OK");
    203. box.setButtonText(QMessageBox::No,"cancel");
    204. //2.调用exec函数运行对话框
    205. int ret=box.exec();
    206. //3.对结果进行判断
    207. if(ret==QMessageBox::Yes)
    208. {
    209. edit2->clear();
    210. }else if(ret==QMessageBox::No)
    211. {
    212. emit my_signal();
    213. }
    214. }

    second.h

    1. #ifndef SECOND_H
    2. #define SECOND_H
    3. #include
    4. namespace Ui {
    5. class Second;
    6. }
    7. class Second : public QWidget
    8. {
    9. Q_OBJECT
    10. public slots:
    11. void jump_slot(); //接收跳转信号的槽函数
    12. public:
    13. explicit Second(QWidget *parent = nullptr);
    14. ~Second();
    15. private:
    16. Ui::Second *ui;
    17. };
    18. #endif // SECOND_H

    second.cpp

    1. #include "second.h"
    2. #include "ui_second.h"
    3. Second::Second(QWidget *parent) :
    4. QWidget(parent),
    5. ui(new Ui::Second)
    6. {
    7. ui->setupUi(this);
    8. }
    9. Second::~Second()
    10. {
    11. delete ui;
    12. }
    13. //接收跳转信号对应的槽函数
    14. void Second::jump_slot()
    15. {
    16. this->show(); //
    17. }

    2.思维导图

  • 相关阅读:
    java.lang.Enum类下hashCode()方法起什么作用呢?
    NDArrayPool源代码解析以及测试程序
    解除PDF限制密码
    从零开始学习makefile(5)makefile中patsubst的作用
    TensorFlow新文档发布:新增CLP、DTensor...最先进的模型已就绪
    生信教程|最大似然系统发育推断
    MFC Windows 程序设计[151]之色彩控件之谜
    在Linux系统中,使用OpenSSL生成私有证书文件,并提取私钥的步骤如下:
    这4款浏览器必装插件,让浏览器使用体验上升100%
    什么是线上优雅停机和调整线程池参数?
  • 原文地址:https://blog.csdn.net/weixin_58469613/article/details/133148276