• Qt项目-安防监控系统(欢迎登录注册)


    目录

    一:开机动画

    1.myItem.h .cpp

    2.myView.h .cpp 

    二:登录+注册

    3.loginWidget.h .cpp

    4.RegisterWidget.h .cpp

    三:MVC设计模式-用户信息

    5.SingelDB.h .cpp

    6.UserControl.h .cpp

    7.UserModel.h .cpp


    本次Qt实战项目-安防监控系统,工程量较大,源码分为四篇呈现,其余三篇文章如下:

    Qt项目-安防监控系统(MVC设计模式) 

    Qt项目-安防监控系统(解码编码转码) 

    Qt项目-安防监控系统(各个界面功能实现) 

    一:开机动画

    1.myItem.h .cpp

    1. #ifndef MYITEM_H
    2. #define MYITEM_H
    3. #include <QObject>//触发信号槽机制
    4. #include<QGraphicsItem>//图元
    5. class myItem : public QObject,public QGraphicsItem//多继承 派生出自己的图元类
    6. {
    7. Q_OBJECT
    8. public:
    9. explicit myItem(QObject *parent = 0);
    10. //自定义图元的带参构造 - 重载
    11. //参数:图片名字 图元类型 图元状态
    12. myItem(QString filename,int iType,bool isStatus);
    13. //碰撞检测函数 虚函数函数字体是斜体字 返回的是一个矩形边框-碰撞检测
    14. QRectF boundingRect() const;
    15. //图元绘制函数 虚函数函数字体是斜体字
    16. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    17. QPixmap image;//2D图元样式 - QPixmap
    18. int iType;//图元类型 根据类型来控制某个图元的运动
    19. bool isStatus;//图元状态 判断是否发生碰撞 bool类型判断状态
    20. signals:
    21. public slots:
    22. //控制图元的移动
    23. void advance(int phase);//纯虚函数 -- 需要自己实现
    24. };
    25. #endif // MYITEM_H
    1. #include "myitem.h"
    2. #include<QPainter>//图元绘制头文件
    3. #include<QDebug>//测试定时器信号槽是否成功触发
    4. myItem::myItem(QObject *parent) : QObject(parent)
    5. {
    6. }
    7. myItem::myItem(QString filename, int iType, bool isStatus)
    8. {
    9. image.load(filename);//加载图片 - 传入图片名
    10. this->iType = iType;//图元类型
    11. this->isStatus = isStatus;//图元状态
    12. }
    13. //碰撞 特效 需要的类
    14. //返回值:一个矩形 - 矩形边框 - 碰撞检测
    15. QRectF myItem::boundingRect() const
    16. {
    17. //参数:坐标系xy 宽高尺寸
    18. return QRectF(0-image.width()/2,0-image.height()/2,image.width(),image.height());
    19. }
    20. void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    21. {
    22. //图元绘制方法
    23. //参数:坐标系xy 宽高尺寸 图元
    24. painter->drawPixmap(0-image.width()/2,0-image.height()/2,image.width(),image.height(),image);
    25. }
    26. //图元移动的相关操作 控制图元的移动 坐标偏移setPos
    27. void myItem::advance(int phase)
    28. {
    29. //根据图元的类型来对不同的图元进行不同的控制
    30. if(this->iType ==1)
    31. {
    32. this->setPos(mapToScene(2,0));//-2负号向左移动
    33. //碰撞会将图元加到链表 - collidingItems的返回值是一个链表 链表数量大于0就是发生碰撞了
    34. if(collidingItems().count()>0)
    35. {
    36. //发生碰撞之后 - 需要改变图元的状态
    37. this->isStatus = true;//有发生碰撞 true
    38. }
    39. }
    40. if(this->iType ==2)
    41. {
    42. this->setPos(mapToScene(-2,0));//2正号向右移动
    43. }
    44. }

    2.myView.h .cpp 

    1. #ifndef MYVIEW_H
    2. #define MYVIEW_H
    3. #include <QObject> //触发信号槽机制
    4. #include<QGraphicsView> //视图
    5. #include<QGraphicsScene> //场景
    6. #include"myitem.h" //图元
    7. #include<QTimer> //定时器 - 图元移动
    8. class myView : public QGraphicsView//派生出自己的视图类
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit myView();//视图中创建场景 场景中放置图元
    13. QGraphicsScene *myScene;//视图中放置场景
    14. myItem *item1,*item2;//场景中放置图元
    15. QTimer *timer,*timer2;//定时器 图元的移动 再定义一个定时器 图元状态检测
    16. signals:
    17. public slots:
    18. void checkItemstatusSlot();//检测图元状态
    19. };
    20. #endif // MYVIEW_H
    1. #include "myview.h"
    2. #include<QDebug>//测试定时器信号槽是否成功触发
    3. #include"setwidget.h"//设置界面
    4. myView::myView()
    5. {
    6. this->resize(400,400);//视图进行尺寸的设置
    7. setWindowFlags(Qt::FramelessWindowHint);//无边框
    8. //自己设置背景图片
    9. QPixmap pixmap(":/image/0508006.jpg");
    10. QPalette palette;
    11. palette.setBrush(backgroundRole(), QBrush(pixmap));
    12. setPalette(palette);
    13. //新建出一个场景
    14. QGraphicsScene *myScene = new QGraphicsScene;
    15. //视图中添加场景
    16. this->setScene(myScene);
    17. //新建两个图元 - 场景中放置图元 图元类型来控制不同的图元的运动
    18. item1 = new myItem(":/image/mao1.png",1,false);//图元1类型 false未碰撞
    19. item2 = new myItem(":/image/yu.png",2,false); //图元2类型 false未碰撞
    20. //设置好图元的起始的位置 - 进行图元的显示
    21. item1->setPos(100,this->height()/2);
    22. item2->setPos(300,this->height()/2);
    23. //在场景中放置图元
    24. myScene->addItem(item1);
    25. myScene->addItem(item2);
    26. //图元的移动使用到定时器
    27. timer = new QTimer(this);
    28. //connect(timer,SIGNAL(timeout()),this,SLOT(timeSlot()));
    29. //让场景中的图元得到控制
    30. // 定时器 超时启动 让场景中的图元得到控制
    31. connect(timer,SIGNAL(timeout()),myScene,SLOT(advance()));
    32. timer->start(1000);//启动定时器
    33. //再使用一个定时器检测图元的状态
    34. timer2 = new QTimer(this);
    35. // 定时器 超时启动 让视图中的图元得到检测
    36. connect(timer2,SIGNAL(timeout()),this,SLOT(checkItemstatusSlot()));
    37. timer2->start(1000);//启动定时器
    38. }
    39. //检测图元状态 - 开机动画结束后跳转设置界面
    40. void myView::checkItemstatusSlot()
    41. {
    42. if(item1->isStatus == true)//图元状态为碰撞时停止 -- 两个定时器都停止
    43. {
    44. qDebug()<<"你已成功开机!";
    45. //碰撞过后,图元的状态需要复位
    46. timer->stop();//图元移动定时器停止
    47. item1->isStatus = false;//图元状态的复位
    48. timer2->stop();//图元检测定时器停止
    49. //开机动画结束后(发生碰撞之后) 跳转到登录界面
    50. SetWidget *setWidget = new SetWidget;
    51. setWidget->show();
    52. this->hide();
    53. }
    54. }

    二:登录+注册

    3.loginWidget.h .cpp

    1. #ifndef LOGINWIDGET_H
    2. #define LOGINWIDGET_H
    3. #include "setcontrol.h"
    4. #include <QWidget>
    5. #include <QLabel>//标签文本
    6. #include <QPushButton>//按钮
    7. #include <QLineEdit>//编辑框
    8. #include <QTime>//定时器
    9. #include <QDialog>//对话框
    10. #include <QPainter>//绘图
    11. #include <QIcon>//可缩放图标
    12. #include <QMessageBox>//消息框
    13. #include<QDebug>//调试
    14. #include <QPaintEvent>//重绘事件
    15. #include <QCryptographicHash>//生成密码散列
    16. #include "usercontrol.h"//控制层
    17. #include "registerwidget.h"//注册界面
    18. #include<QMovie>//动态图
    19. //#include"main_widget.h"//注意:两个类相互引用出现报错找了好久-头疼
    20. class loginWidget : public QWidget
    21. {
    22. Q_OBJECT
    23. public:
    24. explicit loginWidget(QWidget *parent = 0);
    25. void paintEvent(QPaintEvent *event);//验证码干扰元素函数
    26. void init_UI();//UI界面窗口
    27. void init_control();//控件布局设计
    28. void init_connect();//按钮-信号槽
    29. QString getcode();//获取随机验证码
    30. void mousePressEvent(QMouseEvent *event);//鼠标点击事件--重写鼠标点击事件,每次点击一次就随机生成新的验证码
    31. ~loginWidget();//析构
    32. int mark;//标志位-明文密文
    33. signals:
    34. public slots:
    35. void login();//登录验证方法实现
    36. void toreg();//跳转到注册界面
    37. void backlog();//返回到登录界面
    38. void PlainAndCipher();//明文密文显示函数
    39. QString GetMd5(const QString &value);//加密
    40. private:
    41. QLabel *user_label,*password_label,*code_label;//标签
    42. QLabel *gif_label;//放置动态图文本
    43. QLabel *gif1_label;//放置动态图文本
    44. QMovie *movie;//动态图
    45. QLabel *login_label;//登录界面文本
    46. QPushButton *login_btn,*qsc_btn,*register_btn,*eye_btn;//按钮
    47. QLineEdit *user_edit,*password_edit,*Vericode_edit;//编辑框
    48. QString code;//验证码
    49. RegisterWidget *regWin;//登录窗口
    50. };
    51. #endif // LOGINWIDGET_H
    1. #include "loginwidget.h"
    2. #include<QDebug>
    3. #include<QDesktopWidget>
    4. #include "main_widget.h"
    5. //构造
    6. loginWidget::loginWidget(QWidget *parent) : QWidget(parent)
    7. {
    8. this->mark=0;//标志位-明文密文
    9. init_UI();//窗口界面
    10. init_control();//控件
    11. init_connect();//按钮-信号槽
    12. this->code = this->getcode();//验证码
    13. }
    14. //验证码干扰元素函数
    15. void loginWidget::paintEvent(QPaintEvent *event)
    16. {
    17. QPainter painter(this);
    18. QPen pen;
    19. painter.drawPixmap(this->rect(),QPixmap(":image/pt.jpg"));
    20. //画点
    21. for(int i = 0;i < 100;++i)
    22. {
    23. pen = QPen(QColor(qrand()%256,qrand()%256,qrand()%256));
    24. painter.setPen(pen);
    25. painter.drawPoint(300+qrand()%150,245+qrand()%50);//画点--位置设计
    26. }
    27. //画线
    28. for(int i = 0;i < 10;++i)
    29. {
    30. painter.drawLine(300+qrand()%150,245+qrand()%50,
    31. 300+qrand()%150,245+qrand()%50);//画线--位置设计
    32. }
    33. pen = QPen(QColor(255,0,0,100));
    34. QFont font("楷体",25,QFont::Bold,true);
    35. painter.setFont(font);
    36. painter.setPen(pen);
    37. //绘画字
    38. for(int i = 0;i < 4;++i)
    39. {
    40. painter.drawText(300+30*i,245,30,40,Qt::AlignCenter,QString(code[i]));//绘画字--位置设计
    41. }
    42. }
    43. //界面窗口设置
    44. void loginWidget::init_UI()
    45. {
    46. this->setWindowTitle("LoginWin");//窗口标题
    47. this->setFixedSize(500,400);
    48. this->regWin = new RegisterWidget();
    49. setWindowFlags(Qt::FramelessWindowHint);//无边框
    50. //setAttribute(Qt::WA_TranslucentBackground);//背景透明
    51. //自己设置背景图片
    52. QPixmap pixmap(":/image/0508006.jpg");
    53. QPalette palette;
    54. palette.setBrush(backgroundRole(), QBrush(pixmap));
    55. setPalette(palette);
    56. }
    57. //界面控件设置
    58. void loginWidget::init_control()
    59. {
    60. //文本
    61. this->user_label = new QLabel("用户名:",this);
    62. this->user_label->setGeometry(150,150,80,30);
    63. this->password_label = new QLabel("密码:",this);
    64. this->password_label->setGeometry(150,200,80,30);
    65. this->code_label = new QLabel("验证码:",this);
    66. this->code_label->setGeometry(150,250,80,30);
    67. this->gif_label = new QLabel(this);
    68. this->gif_label->setGeometry(30,55,150,150);//动态图文本的位置和大小
    69. this->movie = new QMovie(":/image/0505.gif");//创建对象-动态图选择
    70. this->gif_label->setMovie(movie);//放置动态图
    71. this->movie->start();//动态图显示
    72. this->gif1_label = new QLabel(this);
    73. this->gif1_label->setGeometry(30,195,150,150);//动态图文本的位置和大小
    74. this->movie = new QMovie(":/image/0508002.gif");//创建对象-动态图选择
    75. this->gif1_label->setMovie(movie);//放置动态图
    76. this->movie->start();//动态图显示
    77. this->login_label = new QLabel(this);
    78. this->login_label->setGeometry(185,5,200,100);
    79. this->login_label->setPixmap(QPixmap(":/image/dl1.png").scaled(login_label->size()));
    80. //编辑框
    81. this->user_edit = new QLineEdit(this);
    82. this->user_edit->setGeometry(210,150,150,30);
    83. this->user_edit->setPlaceholderText(tr("请您输入用户名!"));
    84. this->user_edit->setMaxLength(10);
    85. this->user_edit->installEventFilter(this);//事件过滤器-监控目标对象事件
    86. this->password_edit = new QLineEdit(this);
    87. this->password_edit->setGeometry(210,200,150,30);
    88. this->password_edit->setPlaceholderText(tr("请您输入密码!"));
    89. this->password_edit->setMaxLength(10);
    90. this->password_edit->setEchoMode(QLineEdit::Password);
    91. this->Vericode_edit = new QLineEdit(this);
    92. this->Vericode_edit->setGeometry(210,250,80,30);
    93. this->Vericode_edit->setPlaceholderText(tr("验证码"));
    94. //按钮
    95. this->login_btn = new QPushButton("登录",this);
    96. this->login_btn->setGeometry(150,290,80,30);
    97. this->register_btn = new QPushButton("注册",this);
    98. this->register_btn->setGeometry(250,290,80,30);
    99. this->eye_btn = new QPushButton("..",this);
    100. this->eye_btn->setGeometry(370,200,30,30);
    101. this->qsc_btn = new QPushButton("退出",this);
    102. this->qsc_btn->setGeometry(350,290,80,30);
    103. }
    104. //按钮--信号槽连接
    105. void loginWidget::init_connect()
    106. {
    107. //到注册界面
    108. connect(this->register_btn,SIGNAL(clicked()),this,SLOT(toreg()));
    109. //登录验证方法实现
    110. connect(this->login_btn,SIGNAL(clicked()),this,SLOT(login()));
    111. //返回到登录界面
    112. connect(this->regWin,SIGNAL(back()),this,SLOT(backlog()));
    113. //明密文切换实现
    114. connect(this->eye_btn,SIGNAL(clicked()),this,SLOT(PlainAndCipher()));
    115. //关闭按钮关闭窗口
    116. connect(this->qsc_btn,SIGNAL(clicked(bool)),this,SLOT(close()));
    117. }
    118. //生成验证码方法实现
    119. QString loginWidget::getcode()
    120. {
    121. update();
    122. //code为QString类型变量
    123. QString getcode;
    124. //随机数字
    125. for(int i = 0;i < 4;++i)
    126. {
    127. int num = qrand()%3;
    128. if(num == 0)
    129. {
    130. //数字
    131. getcode += QString::number(qrand()%10);
    132. }
    133. else if(num == 1)
    134. {
    135. //大写字母
    136. int temp = 'A';
    137. getcode += static_cast<QChar>(temp + qrand()%26);
    138. } else if(num == 2)
    139. {
    140. //小写字母
    141. int temp = 'a';
    142. getcode += static_cast<QChar>(temp + qrand()%26);
    143. }
    144. }
    145. return getcode;
    146. }
    147. //重写鼠标点击事件,每次点击一次就随机生成新的验证码
    148. void loginWidget::mousePressEvent(QMouseEvent *event)
    149. {
    150. //验证码区域做重写鼠标点击事件
    151. int x = event->x();
    152. int y = event->y();
    153. if(x>300 && x<450 && y>235 && y<285)//位置设计-鼠标在相应位置上点击才做出反应
    154. {
    155. this->code = this->getcode();
    156. }
    157. }
    158. loginWidget::~loginWidget()
    159. {
    160. }
    161. //登录验证方法实现
    162. void loginWidget::login()
    163. {
    164. //获得user_edit输入框的文本:user_edit->text();
    165. //trimmed()--去掉前后空格
    166. //tr()函数--防止设置中文时乱码
    167. int res=UserControl::getInstance()->doLogin(this->user_edit->text().trimmed(),GetMd5(this->password_edit->text().trimmed()));
    168. QString captcha = this->Vericode_edit->text();//验证码编辑框
    169. if(res==0)//账号密码判断
    170. {
    171. if(captcha.toLower() == this->code.toLower())//验证码判断
    172. {
    173. QMessageBox::warning(this, tr("提示!"),tr("登录成功!"),QMessageBox::Yes);
    174. Main_Widget::status = 1;
    175. user_edit->clear();
    176. password_edit->clear();
    177. Vericode_edit->clear();
    178. this->code = this->getcode();
    179. this->close();
    180. return;
    181. }
    182. else
    183. {
    184. QMessageBox::warning(this, tr("警告!"),tr("验证码错误!"),QMessageBox::Yes);
    185. }
    186. }
    187. else
    188. { //标题 内容 OK按钮
    189. QMessageBox::warning(this, tr("警告!"),tr("用户名或密码错误!"),QMessageBox::Yes);
    190. }
    191. // 清空输入框内容
    192. user_edit->clear();
    193. password_edit->clear();
    194. Vericode_edit->clear();
    195. this->code = this->getcode();//获取新验证码
    196. }
    197. //跳转到注册
    198. void loginWidget::toreg()
    199. {
    200. this->hide();
    201. this->regWin->show();
    202. }
    203. //返回到登录
    204. void loginWidget::backlog()
    205. {
    206. this->regWin->close();
    207. this->show();
    208. }
    209. //明文密文显示函数
    210. void loginWidget::PlainAndCipher()
    211. {
    212. //0是密文 1是明文
    213. if(this->mark==0)
    214. {
    215. this->password_edit->setEchoMode(QLineEdit::Normal);
    216. this->mark=1;
    217. }
    218. else if(this->mark==1)
    219. {
    220. this->password_edit->setEchoMode(QLineEdit::Password);
    221. this->mark=0;
    222. }
    223. }
    224. //MD5加密设置
    225. QString loginWidget::GetMd5(const QString &value)
    226. {
    227. QString md5;
    228. QByteArray bb;//相当于是QChar的一个vector<>
    229. bb = QCryptographicHash::hash(value.toUtf8(), QCryptographicHash::Md5);
    230. md5.append(bb.toHex());
    231. return md5;
    232. }

    4.RegisterWidget.h .cpp

    1. #ifndef REGISTERWIDGET_H
    2. #define REGISTERWIDGET_H
    3. #include <QWidget>
    4. #include <QLabel>//标签文本
    5. #include <QPushButton>//按钮
    6. #include <QLineEdit>//编辑框
    7. #include <QDialog>//对话框
    8. #include <QPainter>//绘图
    9. #include <QMessageBox>//消息框
    10. #include <QKeyEvent>//按键事件
    11. #include <QRegExpValidator>//正则
    12. #include <QCryptographicHash>//生成密码散列
    13. #include<QMovie>//动态图
    14. #include "usercontrol.h"//用户控制层
    15. class RegisterWidget : public QWidget
    16. {
    17. Q_OBJECT
    18. public:
    19. explicit RegisterWidget(QWidget *parent = 0);
    20. void keyPressEvent(QKeyEvent *event);//按键事件
    21. void init_UI();//界面窗口
    22. void init_control();//控件布局
    23. void init_connect();//按钮-信号槽机制
    24. int mark;//标志位-明文密文显示
    25. private:
    26. QLabel *account_label,*user_label,*password_label,*password_label2;//标签
    27. QPushButton *register_btn,*qsc_btn,*eye_btn;//按钮
    28. QLineEdit *account_edit,*user_edit,*password_edit,*password_edit2;//编辑框
    29. QLabel *addgif_label;//放置动态图文本
    30. QLabel *addgif1_label;//放置动态图文本
    31. QLabel *register_label;//注册界面文本
    32. QMovie *movie;//动态图
    33. signals:
    34. void back();
    35. public slots:
    36. void regist();//注册
    37. void PlainAndCipher();//明文密文的切换显示
    38. QString GetMd5(const QString &value);//MD5加密处理
    39. };
    40. #endif // REGISTERWIDGET_H
    1. #include "registerwidget.h"
    2. #include<QDebug>
    3. #include<QDesktopWidget>//分辨率
    4. #include<QMessageBox>//消息框
    5. //注册界面构造函数
    6. RegisterWidget::RegisterWidget(QWidget *parent) : QWidget(parent)
    7. {
    8. this->mark = 0;//明文密文标志位
    9. init_UI();//UI窗口
    10. init_control();//控件布局
    11. init_connect();//按钮-信号槽机制
    12. }
    13. //回车键来确定注册
    14. void RegisterWidget::keyPressEvent(QKeyEvent *event)
    15. {
    16. if(event->key() ==Qt::Key_Return)
    17. {
    18. regist();
    19. }
    20. }
    21. //注册界面窗口设置函数
    22. void RegisterWidget::init_UI()
    23. {
    24. this->setFixedSize(500,400);//尺寸设计
    25. setWindowFlags(Qt::FramelessWindowHint);//无边框
    26. //自己设置背景图片
    27. QPixmap pixmap(":/image/0508007.jpg");
    28. QPalette palette;
    29. palette.setBrush(backgroundRole(), QBrush(pixmap));
    30. setPalette(palette);
    31. }
    32. //注册界面控件布局
    33. void RegisterWidget::init_control()
    34. {
    35. //validator为限制输入字符类型,只允许输入大小写、数字和下划线
    36. QRegExp account_regx("[a-zA-Z0-9_]+$");
    37. QValidator *validator = new QRegExpValidator(account_regx, this);
    38. //文本
    39. this->account_label = new QLabel("账号:",this);
    40. this->account_label->setGeometry(180,140,80,30);
    41. this->user_label = new QLabel("用户名:",this);
    42. this->user_label->setGeometry(164,190,80,30);
    43. this->password_label = new QLabel("密码:",this);
    44. this->password_label->setGeometry(176,240,80,30);
    45. this->password_label2 = new QLabel("确认密码:",this);
    46. this->password_label2->setGeometry(150,290,80,30);
    47. //编辑框
    48. this->account_edit = new QLineEdit(this);
    49. this->account_edit->setGeometry(220,140,150,30);
    50. this->account_edit->setPlaceholderText(tr("账号长度为6-10位"));
    51. this->account_edit->setValidator(validator);
    52. this->account_edit->setMaxLength(10);
    53. this->user_edit = new QLineEdit(this);
    54. this->user_edit->setGeometry(220,190,150,30);
    55. this->user_edit->setPlaceholderText(tr("用户名长度为6-10位"));
    56. this->user_edit->setValidator(validator);
    57. this->user_edit->setMaxLength(10);
    58. this->password_edit = new QLineEdit(this);
    59. this->password_edit->setGeometry(220,240,150,30);
    60. this->password_edit->setPlaceholderText(tr("密码长度为6-10位"));
    61. this->password_edit->setMaxLength(10);
    62. this->password_edit->setEchoMode(QLineEdit::Password);
    63. this->password_edit->setValidator(validator);
    64. this->password_edit2 = new QLineEdit(this);
    65. this->password_edit2->setGeometry(220,290,150,30);
    66. this->password_edit2->setPlaceholderText(tr("请再次确认密码!"));
    67. this->password_edit2->setMaxLength(10);
    68. this->password_edit2->setEchoMode(QLineEdit::Password);
    69. this->password_edit2->setValidator(validator);
    70. //按钮
    71. this->eye_btn =new QPushButton("...",this);
    72. this->eye_btn->setGeometry(370,240,30,30);
    73. this->register_btn = new QPushButton("注册",this);
    74. this->register_btn->setGeometry(210,330,80,30);
    75. this->qsc_btn = new QPushButton("取消",this);
    76. this->qsc_btn->setGeometry(290,330,80,30);
    77. this->addgif_label = new QLabel(this);
    78. this->addgif1_label = new QLabel(this);
    79. this->addgif_label->setGeometry(30,55,150,150);//动态图文本的位置和大小
    80. this->movie = new QMovie("image/0508001.gif");//创建对象-动态图选择
    81. this->addgif_label->setMovie(movie);//放置动态图
    82. this->movie->start();//动态图显示
    83. this->addgif1_label->setGeometry(30,195,150,150);//动态图文本的位置和大小
    84. this->movie = new QMovie("image/0508003.gif");//创建对象-动态图选择
    85. this->addgif1_label->setMovie(movie);//放置动态图
    86. this->movie->start();//动态图显示
    87. this->register_label = new QLabel(this);
    88. this->register_label->setGeometry(185,5,200,100);
    89. this->register_label->setPixmap(QPixmap(":/image/zhuce.png").scaled(register_label->size()));
    90. }
    91. //按钮--信号槽机制
    92. void RegisterWidget::init_connect()
    93. {
    94. connect(this->qsc_btn,SIGNAL(clicked()),this,SIGNAL(back()));//返回到登录界面
    95. connect(this->register_btn,SIGNAL(clicked()),this,SLOT(regist()));//注册功能实现
    96. connect(this->eye_btn,SIGNAL(clicked()),this,SLOT(PlainAndCipher()));//明文密文的切换设置
    97. }
    98. //注册功能实现函数
    99. void RegisterWidget::regist()
    100. {
    101. //如果编辑框为空,就提示
    102. if(this->user_edit->text().trimmed() == tr("") || this->password_edit->text() == tr("")
    103. ||this->password_edit2->text() == tr("") )
    104. {
    105. QMessageBox::warning(this, tr("提示!"),tr("内容不能为空!"),QMessageBox::Yes);
    106. // 清空输入框内容
    107. user_edit->clear();
    108. password_edit->clear();
    109. password_edit2->clear();
    110. //光标定位起始输入位置
    111. user_edit->setFocus();
    112. }
    113. else
    114. {
    115. //如果长度大于6就继续判断
    116. if(this->account_edit->text().length()>5 && this->user_edit->text().length()>5 &&
    117. this->password_edit->text().length()>5 && this->password_edit2->text().length()>5)
    118. {
    119. //如果密码和二次输入的密码一致就继续判断
    120. if(this->password_edit->text() == this->password_edit2->text())
    121. {
    122. //数据库查询是否存在该账号
    123. int res=UserControl::getInstance()->doReister(this->account_edit->text().trimmed(),this->user_edit->text().trimmed(),
    124. GetMd5(this->password_edit->text().trimmed()));
    125. //res为0就代表的是注册成功
    126. if(res==0)
    127. {
    128. QMessageBox::warning(this, tr("提示!"),tr("注册成功!"),QMessageBox::Yes);
    129. //清空输入编辑框中的内容
    130. user_edit->clear();
    131. password_edit->clear();
    132. password_edit2->clear();
    133. //注册成功后就发送信号跳到登录
    134. back();
    135. }
    136. //res为1就注册失败,该用户存在
    137. else if(res==1)
    138. {
    139. QMessageBox::warning(this, tr("提示!"),tr("该用户已经存在!"),QMessageBox::Yes);
    140. //清空输入编辑框中的内容
    141. account_edit->clear();
    142. user_edit->clear();
    143. password_edit->clear();
    144. password_edit2->clear();
    145. }
    146. }
    147. else
    148. {
    149. QMessageBox::warning(this, tr("提示!"),tr("密码不一致!"),QMessageBox::Yes);
    150. //清空输入编辑框中的内容
    151. account_edit->clear();
    152. user_edit->clear();
    153. password_edit->clear();
    154. password_edit2->clear();
    155. //光标定位
    156. user_edit->setFocus();
    157. }
    158. }
    159. else
    160. {
    161. if(this->account_edit->text().length()<6)
    162. {
    163. QMessageBox::warning(this, tr("提示!"),tr("账号长度为6-10位!"),QMessageBox::Yes);
    164. }
    165. else if (this->user_edit->text().length()<6)
    166. {
    167. QMessageBox::warning(this, tr("提示!"),tr("用户名长度为6-10位!"),QMessageBox::Yes);
    168. }
    169. else if (this->password_edit->text().length()<6)
    170. {
    171. QMessageBox::warning(this, tr("提示!"),tr("密码长度为6-10位!"),QMessageBox::Yes);
    172. }
    173. else if (this->password_edit2->text().length()<6)
    174. {
    175. QMessageBox::warning(this, tr("提示!"),tr("密码长度为6-10位!"),QMessageBox::Yes);
    176. }
    177. //清空输入编辑框中的内容
    178. account_edit->clear();
    179. user_edit->clear();
    180. password_edit->clear();
    181. password_edit2->clear();
    182. //光标定位
    183. user_edit->setFocus();
    184. }
    185. }
    186. }
    187. //明文密文切换函数
    188. void RegisterWidget::PlainAndCipher()
    189. {
    190. //0是密文 1是明文
    191. if(this->mark==0)
    192. {
    193. this->password_edit->setEchoMode(QLineEdit::Normal);
    194. this->password_edit2->setEchoMode(QLineEdit::Normal);
    195. this->mark=1;
    196. }
    197. else if(this->mark==1)
    198. {
    199. this->password_edit->setEchoMode(QLineEdit::Password);
    200. this->password_edit2->setEchoMode(QLineEdit::Password);
    201. this->mark=0;
    202. }
    203. }
    204. //MD5加密处理
    205. QString RegisterWidget::GetMd5(const QString &value)
    206. {
    207. QString md5;
    208. QByteArray bb;
    209. bb = QCryptographicHash::hash(value.toUtf8(), QCryptographicHash::Md5);
    210. md5.append(bb.toHex());
    211. return md5;
    212. }

    三:MVC设计模式-用户信息

    5.SingelDB.h .cpp

    1. #ifndef SINGELDB_H
    2. #define SINGELDB_H
    3. #include "sqlite3.h"//数据库
    4. #include <iostream>
    5. using namespace std;
    6. class SingelDB
    7. {
    8. public:
    9. // SingelDB();
    10. ~SingelDB();//析构
    11. static SingelDB *getInstance();//外部公共接口--获取model对象
    12. int dosql(char *sql,char **&result,int &row, int &col);//数据库执行
    13. void openDataBase(const char *dbPath);//打开数据库
    14. void closeDataBase();//关闭数据库
    15. private:
    16. SingelDB();//构造函数私有化
    17. static SingelDB *myDB;//静态私成员变量
    18. sqlite3 *sqldb;//数据库
    19. char *errmsg;//用来存储错误信息字符串
    20. };
    21. #endif // SINGELDB_H
    1. #include "singeldb.h"
    2. SingelDB *SingelDB::myDB=nullptr;
    3. //单例打开数据库路径
    4. SingelDB::SingelDB()
    5. {
    6. this->openDataBase("../data/video.db");//打开数据库
    7. }
    8. //外部公共接口--获取单例对象
    9. SingelDB *SingelDB::getInstance()
    10. {
    11. if(SingelDB::myDB==nullptr)
    12. {
    13. SingelDB::myDB=new SingelDB();
    14. }
    15. return SingelDB::myDB;
    16. }
    17. //数据库执行-查找数据
    18. int SingelDB::dosql(char *sql, char **&result, int &row, int &col)
    19. {
    20. int res =sqlite3_get_table(sqldb, sql, &result, &row, &col, &errmsg);
    21. if(res!=SQLITE_OK)
    22. {
    23. cout<<sqlite3_errmsg(sqldb)<<endl;
    24. return res;
    25. }
    26. return 0;
    27. }
    28. //打开数据库
    29. void SingelDB::openDataBase(const char *dbPath)
    30. {
    31. int res = sqlite3_open(dbPath, &sqldb);
    32. if(res != SQLITE_OK)
    33. {
    34. cout<<sqlite3_errmsg(sqldb)<<endl;
    35. cout<<sqlite3_errcode(sqldb)<<endl;
    36. }
    37. }
    38. //关闭数据库
    39. void SingelDB::closeDataBase()
    40. {
    41. int res = sqlite3_close(sqldb);
    42. if(res != SQLITE_OK)
    43. {
    44. cout<<sqlite3_errmsg(sqldb)<<endl;
    45. cout<<sqlite3_errcode (sqldb) <<endl;
    46. }
    47. }

    6.UserControl.h .cpp

    1. #ifndef USERCONTROL_H
    2. #define USERCONTROL_H
    3. #include <QString>
    4. #include "usermodel.h"//用户模型层
    5. class UserControl
    6. {
    7. public:
    8. static UserControl *getInstance();//外部公共接口 获取control对象
    9. int doLogin(QString account,QString pwd);//登录验证
    10. int doReister(QString account,QString user_name, QString pwd);//注册
    11. private:
    12. UserControl();//构造私有化
    13. static UserControl *contorl;//静态私成员变量
    14. };
    15. #endif // USERCONTROL_H
    1. #include "usercontrol.h"
    2. UserControl *UserControl::contorl=nullptr;
    3. //外部公共接口 获取control对象
    4. UserControl *UserControl::getInstance()
    5. {
    6. if(UserControl::contorl=nullptr)
    7. {
    8. UserControl::contorl=new UserControl();
    9. }
    10. return UserControl::contorl;
    11. }
    12. //登录验证,0表示验证成功,1表示验证失败
    13. int UserControl::doLogin(QString account, QString pwd)
    14. {
    15. return UserModel::getInstance()->getUserByNamePwd(account,pwd);
    16. }
    17. //注册
    18. int UserControl::doReister(QString account,QString user_name, QString pwd)
    19. {
    20. int res=UserModel::getInstance()->checkUserByNamePwd(account);
    21. //res为0说明用户存在
    22. if(res==1)
    23. {
    24. return UserModel::getInstance()->addUser(account,user_name,pwd);
    25. }
    26. //res为1说明用户不存在
    27. else
    28. {
    29. return -1;
    30. }
    31. }
    32. UserControl::UserControl()
    33. {
    34. }

    7.UserModel.h .cpp

    1. #ifndef USERMODEL_H
    2. #define USERMODEL_H
    3. #include <QString>//字符串
    4. #include <QDebug>//调试
    5. #include "singeldb.h"//数据库
    6. #include <iostream>
    7. using namespace std;
    8. class UserModel
    9. {
    10. public:
    11. static UserModel *getInstance();//外部公共接口 获取model对象
    12. int getUserByNamePwd(QString account,QString pwd);//对用户的用户名密码进行验证
    13. int addUser(QString account,QString user_name,QString pwd);//添加用户数据信息
    14. int checkUserByNamePwd(QString account);//判断用户是否存在
    15. private:
    16. UserModel();//构造函数私有化
    17. static UserModel *moder;//静态私成员变量
    18. sqlite3 *sqldb;//数据库
    19. char *errmsg;//用来存储错误信息字符串
    20. };
    21. #endif // USERMODEL_H
    1. #include "usermodel.h"
    2. UserModel *UserModel::moder =nullptr;
    3. UserModel::UserModel(){}
    4. //外部公共接口 获取model对象
    5. UserModel *UserModel::getInstance()
    6. {
    7. if(UserModel::moder==nullptr)
    8. {
    9. UserModel::moder=new UserModel;
    10. }
    11. return UserModel::moder;
    12. }
    13. //对用户的用户名密码进行验证
    14. int UserModel::getUserByNamePwd(QString account, QString pwd)
    15. {
    16. char sql[256];
    17. char **qres;
    18. int row,col;
    19. sprintf(sql,"select * from user where account='%s' AND password='%s';",
    20. account.toStdString().c_str(),pwd.toStdString().c_str());
    21. int res = SingelDB::getInstance()->dosql(sql,qres,row,col);
    22. //res为查询成功
    23. if(res==0)
    24. {
    25. //如果row大于0说明验证成功
    26. if(row>0)
    27. {
    28. return 0;
    29. }
    30. //反之说明验证失败
    31. else
    32. {
    33. return 1;
    34. }
    35. }
    36. //查询失败
    37. else
    38. {
    39. return -1;
    40. }
    41. }
    42. //判断用户是否存在
    43. int UserModel::checkUserByNamePwd(QString account)
    44. {
    45. char sql[256];
    46. sprintf(sql,"select * from user where account='%s';",
    47. account.toStdString().c_str());
    48. char **qres;
    49. int row,col;
    50. int res = SingelDB::getInstance()->dosql(sql,qres,row,col);
    51. if(res==0)
    52. {
    53. //如果row大于0用户存在
    54. if(row>0)
    55. {
    56. return 0;
    57. }
    58. //反之说明用户不存在
    59. else
    60. {
    61. return 1;
    62. }
    63. }
    64. //查询失败
    65. else
    66. {
    67. return -1;
    68. }
    69. }
    70. //添加用户数据信息
    71. int UserModel::addUser(QString account,QString user_name, QString pwd)
    72. {
    73. char sql[256];
    74. sprintf(sql,"insert into user(account,user_name,password)values('%s','%s','%s');",
    75. account.toStdString().c_str(),user_name.toStdString().c_str(),pwd.toStdString().c_str());
    76. char **qres;
    77. int row,col;
    78. return SingelDB::getInstance()->dosql(sql,qres,row,col);
    79. }
  • 相关阅读:
    Java | 有序表的简单结构
    【容器】Docker(学习笔记)
    B站视频下载工具的分享
    新版本外国人永久居留身份证EST-100身份证阅读器接口更新
    百度大模型算法实习岗上岸经验!
    非连续分配管理方式之基本分页存储管理
    【API 管理】什么是 API 管理,为什么它很重要?
    Golang优雅实现按比例切分流量
    Java的JDBC编程
    C++ STL进阶与补充(deque容器)
  • 原文地址:https://blog.csdn.net/m0_56051805/article/details/125282373