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

- #ifndef MYITEM_H
- #define MYITEM_H
-
- #include <QObject>//触发信号槽机制
- #include<QGraphicsItem>//图元
-
- class myItem : public QObject,public QGraphicsItem//多继承 派生出自己的图元类
- {
- Q_OBJECT
- public:
- explicit myItem(QObject *parent = 0);
- //自定义图元的带参构造 - 重载
- //参数:图片名字 图元类型 图元状态
- myItem(QString filename,int iType,bool isStatus);
- //碰撞检测函数 虚函数函数字体是斜体字 返回的是一个矩形边框-碰撞检测
- QRectF boundingRect() const;
- //图元绘制函数 虚函数函数字体是斜体字
- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
- QPixmap image;//2D图元样式 - QPixmap
- int iType;//图元类型 根据类型来控制某个图元的运动
- bool isStatus;//图元状态 判断是否发生碰撞 bool类型判断状态
- signals:
-
- public slots:
- //控制图元的移动
- void advance(int phase);//纯虚函数 -- 需要自己实现
- };
-
- #endif // MYITEM_H
- #include "myitem.h"
- #include<QPainter>//图元绘制头文件
- #include<QDebug>//测试定时器信号槽是否成功触发
-
- myItem::myItem(QObject *parent) : QObject(parent)
- {
- }
-
- myItem::myItem(QString filename, int iType, bool isStatus)
- {
- image.load(filename);//加载图片 - 传入图片名
- this->iType = iType;//图元类型
- this->isStatus = isStatus;//图元状态
- }
-
- //碰撞 特效 需要的类
- //返回值:一个矩形 - 矩形边框 - 碰撞检测
- QRectF myItem::boundingRect() const
- {
- //参数:坐标系xy 宽高尺寸
- return QRectF(0-image.width()/2,0-image.height()/2,image.width(),image.height());
- }
-
- void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- //图元绘制方法
- //参数:坐标系xy 宽高尺寸 图元
- painter->drawPixmap(0-image.width()/2,0-image.height()/2,image.width(),image.height(),image);
- }
-
- //图元移动的相关操作 控制图元的移动 坐标偏移setPos
- void myItem::advance(int phase)
- {
- //根据图元的类型来对不同的图元进行不同的控制
- if(this->iType ==1)
- {
- this->setPos(mapToScene(2,0));//-2负号向左移动
- //碰撞会将图元加到链表 - collidingItems的返回值是一个链表 链表数量大于0就是发生碰撞了
- if(collidingItems().count()>0)
- {
- //发生碰撞之后 - 需要改变图元的状态
- this->isStatus = true;//有发生碰撞 true
- }
- }
- if(this->iType ==2)
- {
- this->setPos(mapToScene(-2,0));//2正号向右移动
- }
- }
- #ifndef MYVIEW_H
- #define MYVIEW_H
-
- #include <QObject> //触发信号槽机制
- #include<QGraphicsView> //视图
- #include<QGraphicsScene> //场景
- #include"myitem.h" //图元
- #include<QTimer> //定时器 - 图元移动
-
- class myView : public QGraphicsView//派生出自己的视图类
- {
- Q_OBJECT
- public:
- explicit myView();//视图中创建场景 场景中放置图元
- QGraphicsScene *myScene;//视图中放置场景
- myItem *item1,*item2;//场景中放置图元
- QTimer *timer,*timer2;//定时器 图元的移动 再定义一个定时器 图元状态检测
- signals:
-
- public slots:
- void checkItemstatusSlot();//检测图元状态
- };
-
- #endif // MYVIEW_H
- #include "myview.h"
- #include<QDebug>//测试定时器信号槽是否成功触发
- #include"setwidget.h"//设置界面
-
- myView::myView()
- {
- this->resize(400,400);//视图进行尺寸的设置
- setWindowFlags(Qt::FramelessWindowHint);//无边框
- //自己设置背景图片
- QPixmap pixmap(":/image/0508006.jpg");
- QPalette palette;
- palette.setBrush(backgroundRole(), QBrush(pixmap));
- setPalette(palette);
- //新建出一个场景
- QGraphicsScene *myScene = new QGraphicsScene;
- //视图中添加场景
- this->setScene(myScene);
- //新建两个图元 - 场景中放置图元 图元类型来控制不同的图元的运动
- item1 = new myItem(":/image/mao1.png",1,false);//图元1类型 false未碰撞
- item2 = new myItem(":/image/yu.png",2,false); //图元2类型 false未碰撞
- //设置好图元的起始的位置 - 进行图元的显示
- item1->setPos(100,this->height()/2);
- item2->setPos(300,this->height()/2);
- //在场景中放置图元
- myScene->addItem(item1);
- myScene->addItem(item2);
- //图元的移动使用到定时器
- timer = new QTimer(this);
- //connect(timer,SIGNAL(timeout()),this,SLOT(timeSlot()));
- //让场景中的图元得到控制
- // 定时器 超时启动 让场景中的图元得到控制
- connect(timer,SIGNAL(timeout()),myScene,SLOT(advance()));
- timer->start(1000);//启动定时器
- //再使用一个定时器检测图元的状态
- timer2 = new QTimer(this);
- // 定时器 超时启动 让视图中的图元得到检测
- connect(timer2,SIGNAL(timeout()),this,SLOT(checkItemstatusSlot()));
- timer2->start(1000);//启动定时器
- }
-
- //检测图元状态 - 开机动画结束后跳转设置界面
- void myView::checkItemstatusSlot()
- {
- if(item1->isStatus == true)//图元状态为碰撞时停止 -- 两个定时器都停止
- {
- qDebug()<<"你已成功开机!";
- //碰撞过后,图元的状态需要复位
- timer->stop();//图元移动定时器停止
- item1->isStatus = false;//图元状态的复位
- timer2->stop();//图元检测定时器停止
- //开机动画结束后(发生碰撞之后) 跳转到登录界面
- SetWidget *setWidget = new SetWidget;
- setWidget->show();
- this->hide();
- }
- }


- #ifndef LOGINWIDGET_H
- #define LOGINWIDGET_H
-
- #include "setcontrol.h"
- #include <QWidget>
- #include <QLabel>//标签文本
- #include <QPushButton>//按钮
- #include <QLineEdit>//编辑框
- #include <QTime>//定时器
- #include <QDialog>//对话框
- #include <QPainter>//绘图
- #include <QIcon>//可缩放图标
- #include <QMessageBox>//消息框
- #include<QDebug>//调试
- #include <QPaintEvent>//重绘事件
- #include <QCryptographicHash>//生成密码散列
- #include "usercontrol.h"//控制层
- #include "registerwidget.h"//注册界面
- #include<QMovie>//动态图
- //#include"main_widget.h"//注意:两个类相互引用出现报错找了好久-头疼
-
- class loginWidget : public QWidget
- {
- Q_OBJECT
- public:
- explicit loginWidget(QWidget *parent = 0);
- void paintEvent(QPaintEvent *event);//验证码干扰元素函数
- void init_UI();//UI界面窗口
- void init_control();//控件布局设计
- void init_connect();//按钮-信号槽
- QString getcode();//获取随机验证码
- void mousePressEvent(QMouseEvent *event);//鼠标点击事件--重写鼠标点击事件,每次点击一次就随机生成新的验证码
- ~loginWidget();//析构
- int mark;//标志位-明文密文
- signals:
-
- public slots:
- void login();//登录验证方法实现
- void toreg();//跳转到注册界面
- void backlog();//返回到登录界面
- void PlainAndCipher();//明文密文显示函数
- QString GetMd5(const QString &value);//加密
- private:
- QLabel *user_label,*password_label,*code_label;//标签
- QLabel *gif_label;//放置动态图文本
- QLabel *gif1_label;//放置动态图文本
- QMovie *movie;//动态图
- QLabel *login_label;//登录界面文本
- QPushButton *login_btn,*qsc_btn,*register_btn,*eye_btn;//按钮
- QLineEdit *user_edit,*password_edit,*Vericode_edit;//编辑框
- QString code;//验证码
- RegisterWidget *regWin;//登录窗口
- };
-
- #endif // LOGINWIDGET_H
- #include "loginwidget.h"
- #include<QDebug>
- #include<QDesktopWidget>
- #include "main_widget.h"
-
- //构造
- loginWidget::loginWidget(QWidget *parent) : QWidget(parent)
- {
- this->mark=0;//标志位-明文密文
- init_UI();//窗口界面
- init_control();//控件
- init_connect();//按钮-信号槽
- this->code = this->getcode();//验证码
- }
-
- //验证码干扰元素函数
- void loginWidget::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- QPen pen;
-
- painter.drawPixmap(this->rect(),QPixmap(":image/pt.jpg"));
-
- //画点
- for(int i = 0;i < 100;++i)
- {
- pen = QPen(QColor(qrand()%256,qrand()%256,qrand()%256));
- painter.setPen(pen);
- painter.drawPoint(300+qrand()%150,245+qrand()%50);//画点--位置设计
- }
- //画线
- for(int i = 0;i < 10;++i)
- {
- painter.drawLine(300+qrand()%150,245+qrand()%50,
- 300+qrand()%150,245+qrand()%50);//画线--位置设计
- }
- pen = QPen(QColor(255,0,0,100));
- QFont font("楷体",25,QFont::Bold,true);
- painter.setFont(font);
- painter.setPen(pen);
- //绘画字
- for(int i = 0;i < 4;++i)
- {
- painter.drawText(300+30*i,245,30,40,Qt::AlignCenter,QString(code[i]));//绘画字--位置设计
- }
- }
-
- //界面窗口设置
- void loginWidget::init_UI()
- {
- this->setWindowTitle("LoginWin");//窗口标题
- this->setFixedSize(500,400);
- this->regWin = new RegisterWidget();
- setWindowFlags(Qt::FramelessWindowHint);//无边框
- //setAttribute(Qt::WA_TranslucentBackground);//背景透明
- //自己设置背景图片
- QPixmap pixmap(":/image/0508006.jpg");
- QPalette palette;
- palette.setBrush(backgroundRole(), QBrush(pixmap));
- setPalette(palette);
- }
-
- //界面控件设置
- void loginWidget::init_control()
- {
- //文本
- this->user_label = new QLabel("用户名:",this);
- this->user_label->setGeometry(150,150,80,30);
- this->password_label = new QLabel("密码:",this);
- this->password_label->setGeometry(150,200,80,30);
- this->code_label = new QLabel("验证码:",this);
- this->code_label->setGeometry(150,250,80,30);
- this->gif_label = new QLabel(this);
- this->gif_label->setGeometry(30,55,150,150);//动态图文本的位置和大小
- this->movie = new QMovie(":/image/0505.gif");//创建对象-动态图选择
- this->gif_label->setMovie(movie);//放置动态图
- this->movie->start();//动态图显示
- this->gif1_label = new QLabel(this);
- this->gif1_label->setGeometry(30,195,150,150);//动态图文本的位置和大小
- this->movie = new QMovie(":/image/0508002.gif");//创建对象-动态图选择
- this->gif1_label->setMovie(movie);//放置动态图
- this->movie->start();//动态图显示
- this->login_label = new QLabel(this);
- this->login_label->setGeometry(185,5,200,100);
- this->login_label->setPixmap(QPixmap(":/image/dl1.png").scaled(login_label->size()));
- //编辑框
- this->user_edit = new QLineEdit(this);
- this->user_edit->setGeometry(210,150,150,30);
- this->user_edit->setPlaceholderText(tr("请您输入用户名!"));
- this->user_edit->setMaxLength(10);
- this->user_edit->installEventFilter(this);//事件过滤器-监控目标对象事件
- this->password_edit = new QLineEdit(this);
- this->password_edit->setGeometry(210,200,150,30);
- this->password_edit->setPlaceholderText(tr("请您输入密码!"));
- this->password_edit->setMaxLength(10);
- this->password_edit->setEchoMode(QLineEdit::Password);
- this->Vericode_edit = new QLineEdit(this);
- this->Vericode_edit->setGeometry(210,250,80,30);
- this->Vericode_edit->setPlaceholderText(tr("验证码"));
- //按钮
- this->login_btn = new QPushButton("登录",this);
- this->login_btn->setGeometry(150,290,80,30);
- this->register_btn = new QPushButton("注册",this);
- this->register_btn->setGeometry(250,290,80,30);
- this->eye_btn = new QPushButton("..",this);
- this->eye_btn->setGeometry(370,200,30,30);
- this->qsc_btn = new QPushButton("退出",this);
- this->qsc_btn->setGeometry(350,290,80,30);
- }
-
- //按钮--信号槽连接
- void loginWidget::init_connect()
- {
- //到注册界面
- connect(this->register_btn,SIGNAL(clicked()),this,SLOT(toreg()));
- //登录验证方法实现
- connect(this->login_btn,SIGNAL(clicked()),this,SLOT(login()));
- //返回到登录界面
- connect(this->regWin,SIGNAL(back()),this,SLOT(backlog()));
- //明密文切换实现
- connect(this->eye_btn,SIGNAL(clicked()),this,SLOT(PlainAndCipher()));
- //关闭按钮关闭窗口
- connect(this->qsc_btn,SIGNAL(clicked(bool)),this,SLOT(close()));
- }
-
- //生成验证码方法实现
- QString loginWidget::getcode()
- {
- update();
- //code为QString类型变量
- QString getcode;
- //随机数字
- for(int i = 0;i < 4;++i)
- {
- int num = qrand()%3;
- if(num == 0)
- {
- //数字
- getcode += QString::number(qrand()%10);
- }
- else if(num == 1)
- {
- //大写字母
- int temp = 'A';
- getcode += static_cast<QChar>(temp + qrand()%26);
- } else if(num == 2)
- {
- //小写字母
- int temp = 'a';
- getcode += static_cast<QChar>(temp + qrand()%26);
- }
- }
- return getcode;
- }
-
- //重写鼠标点击事件,每次点击一次就随机生成新的验证码
- void loginWidget::mousePressEvent(QMouseEvent *event)
- {
- //验证码区域做重写鼠标点击事件
- int x = event->x();
- int y = event->y();
- if(x>300 && x<450 && y>235 && y<285)//位置设计-鼠标在相应位置上点击才做出反应
- {
- this->code = this->getcode();
- }
- }
-
- loginWidget::~loginWidget()
- {
- }
-
- //登录验证方法实现
- void loginWidget::login()
- {
- //获得user_edit输入框的文本:user_edit->text();
- //trimmed()--去掉前后空格
- //tr()函数--防止设置中文时乱码
- int res=UserControl::getInstance()->doLogin(this->user_edit->text().trimmed(),GetMd5(this->password_edit->text().trimmed()));
- QString captcha = this->Vericode_edit->text();//验证码编辑框
- if(res==0)//账号密码判断
- {
- if(captcha.toLower() == this->code.toLower())//验证码判断
- {
- QMessageBox::warning(this, tr("提示!"),tr("登录成功!"),QMessageBox::Yes);
- Main_Widget::status = 1;
- user_edit->clear();
- password_edit->clear();
- Vericode_edit->clear();
- this->code = this->getcode();
- this->close();
- return;
- }
- else
- {
- QMessageBox::warning(this, tr("警告!"),tr("验证码错误!"),QMessageBox::Yes);
- }
- }
- else
- { //标题 内容 OK按钮
- QMessageBox::warning(this, tr("警告!"),tr("用户名或密码错误!"),QMessageBox::Yes);
- }
- // 清空输入框内容
- user_edit->clear();
- password_edit->clear();
- Vericode_edit->clear();
- this->code = this->getcode();//获取新验证码
- }
-
- //跳转到注册
- void loginWidget::toreg()
- {
- this->hide();
- this->regWin->show();
- }
-
- //返回到登录
- void loginWidget::backlog()
- {
- this->regWin->close();
- this->show();
- }
-
- //明文密文显示函数
- void loginWidget::PlainAndCipher()
- {
- //0是密文 1是明文
- if(this->mark==0)
- {
- this->password_edit->setEchoMode(QLineEdit::Normal);
- this->mark=1;
- }
- else if(this->mark==1)
- {
- this->password_edit->setEchoMode(QLineEdit::Password);
- this->mark=0;
- }
- }
-
- //MD5加密设置
- QString loginWidget::GetMd5(const QString &value)
- {
- QString md5;
- QByteArray bb;//相当于是QChar的一个vector<>
- bb = QCryptographicHash::hash(value.toUtf8(), QCryptographicHash::Md5);
- md5.append(bb.toHex());
- return md5;
- }
- #ifndef REGISTERWIDGET_H
- #define REGISTERWIDGET_H
-
- #include <QWidget>
- #include <QLabel>//标签文本
- #include <QPushButton>//按钮
- #include <QLineEdit>//编辑框
- #include <QDialog>//对话框
- #include <QPainter>//绘图
- #include <QMessageBox>//消息框
- #include <QKeyEvent>//按键事件
- #include <QRegExpValidator>//正则
- #include <QCryptographicHash>//生成密码散列
- #include<QMovie>//动态图
- #include "usercontrol.h"//用户控制层
-
- class RegisterWidget : public QWidget
- {
- Q_OBJECT
- public:
- explicit RegisterWidget(QWidget *parent = 0);
- void keyPressEvent(QKeyEvent *event);//按键事件
- void init_UI();//界面窗口
- void init_control();//控件布局
- void init_connect();//按钮-信号槽机制
- int mark;//标志位-明文密文显示
- private:
- QLabel *account_label,*user_label,*password_label,*password_label2;//标签
- QPushButton *register_btn,*qsc_btn,*eye_btn;//按钮
- QLineEdit *account_edit,*user_edit,*password_edit,*password_edit2;//编辑框
- QLabel *addgif_label;//放置动态图文本
- QLabel *addgif1_label;//放置动态图文本
- QLabel *register_label;//注册界面文本
- QMovie *movie;//动态图
-
- signals:
- void back();
-
- public slots:
- void regist();//注册
- void PlainAndCipher();//明文密文的切换显示
- QString GetMd5(const QString &value);//MD5加密处理
- };
-
- #endif // REGISTERWIDGET_H
- #include "registerwidget.h"
- #include<QDebug>
- #include<QDesktopWidget>//分辨率
- #include<QMessageBox>//消息框
-
- //注册界面构造函数
- RegisterWidget::RegisterWidget(QWidget *parent) : QWidget(parent)
- {
- this->mark = 0;//明文密文标志位
- init_UI();//UI窗口
- init_control();//控件布局
- init_connect();//按钮-信号槽机制
- }
-
- //回车键来确定注册
- void RegisterWidget::keyPressEvent(QKeyEvent *event)
- {
- if(event->key() ==Qt::Key_Return)
- {
- regist();
- }
- }
-
- //注册界面窗口设置函数
- void RegisterWidget::init_UI()
- {
- this->setFixedSize(500,400);//尺寸设计
- setWindowFlags(Qt::FramelessWindowHint);//无边框
- //自己设置背景图片
- QPixmap pixmap(":/image/0508007.jpg");
- QPalette palette;
- palette.setBrush(backgroundRole(), QBrush(pixmap));
- setPalette(palette);
- }
-
- //注册界面控件布局
- void RegisterWidget::init_control()
- {
- //validator为限制输入字符类型,只允许输入大小写、数字和下划线
- QRegExp account_regx("[a-zA-Z0-9_]+$");
- QValidator *validator = new QRegExpValidator(account_regx, this);
- //文本
- this->account_label = new QLabel("账号:",this);
- this->account_label->setGeometry(180,140,80,30);
- this->user_label = new QLabel("用户名:",this);
- this->user_label->setGeometry(164,190,80,30);
- this->password_label = new QLabel("密码:",this);
- this->password_label->setGeometry(176,240,80,30);
- this->password_label2 = new QLabel("确认密码:",this);
- this->password_label2->setGeometry(150,290,80,30);
- //编辑框
- this->account_edit = new QLineEdit(this);
- this->account_edit->setGeometry(220,140,150,30);
- this->account_edit->setPlaceholderText(tr("账号长度为6-10位"));
- this->account_edit->setValidator(validator);
- this->account_edit->setMaxLength(10);
- this->user_edit = new QLineEdit(this);
- this->user_edit->setGeometry(220,190,150,30);
- this->user_edit->setPlaceholderText(tr("用户名长度为6-10位"));
- this->user_edit->setValidator(validator);
- this->user_edit->setMaxLength(10);
- this->password_edit = new QLineEdit(this);
- this->password_edit->setGeometry(220,240,150,30);
- this->password_edit->setPlaceholderText(tr("密码长度为6-10位"));
- this->password_edit->setMaxLength(10);
- this->password_edit->setEchoMode(QLineEdit::Password);
- this->password_edit->setValidator(validator);
- this->password_edit2 = new QLineEdit(this);
- this->password_edit2->setGeometry(220,290,150,30);
- this->password_edit2->setPlaceholderText(tr("请再次确认密码!"));
- this->password_edit2->setMaxLength(10);
- this->password_edit2->setEchoMode(QLineEdit::Password);
- this->password_edit2->setValidator(validator);
- //按钮
- this->eye_btn =new QPushButton("...",this);
- this->eye_btn->setGeometry(370,240,30,30);
- this->register_btn = new QPushButton("注册",this);
- this->register_btn->setGeometry(210,330,80,30);
- this->qsc_btn = new QPushButton("取消",this);
- this->qsc_btn->setGeometry(290,330,80,30);
-
- this->addgif_label = new QLabel(this);
- this->addgif1_label = new QLabel(this);
- this->addgif_label->setGeometry(30,55,150,150);//动态图文本的位置和大小
- this->movie = new QMovie("image/0508001.gif");//创建对象-动态图选择
- this->addgif_label->setMovie(movie);//放置动态图
- this->movie->start();//动态图显示
- this->addgif1_label->setGeometry(30,195,150,150);//动态图文本的位置和大小
- this->movie = new QMovie("image/0508003.gif");//创建对象-动态图选择
- this->addgif1_label->setMovie(movie);//放置动态图
- this->movie->start();//动态图显示
- this->register_label = new QLabel(this);
- this->register_label->setGeometry(185,5,200,100);
- this->register_label->setPixmap(QPixmap(":/image/zhuce.png").scaled(register_label->size()));
- }
-
- //按钮--信号槽机制
- void RegisterWidget::init_connect()
- {
- connect(this->qsc_btn,SIGNAL(clicked()),this,SIGNAL(back()));//返回到登录界面
- connect(this->register_btn,SIGNAL(clicked()),this,SLOT(regist()));//注册功能实现
- connect(this->eye_btn,SIGNAL(clicked()),this,SLOT(PlainAndCipher()));//明文密文的切换设置
- }
-
- //注册功能实现函数
- void RegisterWidget::regist()
- {
- //如果编辑框为空,就提示
- if(this->user_edit->text().trimmed() == tr("") || this->password_edit->text() == tr("")
- ||this->password_edit2->text() == tr("") )
- {
- QMessageBox::warning(this, tr("提示!"),tr("内容不能为空!"),QMessageBox::Yes);
- // 清空输入框内容
- user_edit->clear();
- password_edit->clear();
- password_edit2->clear();
- //光标定位起始输入位置
- user_edit->setFocus();
- }
- else
- {
- //如果长度大于6就继续判断
- if(this->account_edit->text().length()>5 && this->user_edit->text().length()>5 &&
- this->password_edit->text().length()>5 && this->password_edit2->text().length()>5)
- {
- //如果密码和二次输入的密码一致就继续判断
- if(this->password_edit->text() == this->password_edit2->text())
- {
- //数据库查询是否存在该账号
- int res=UserControl::getInstance()->doReister(this->account_edit->text().trimmed(),this->user_edit->text().trimmed(),
- GetMd5(this->password_edit->text().trimmed()));
- //res为0就代表的是注册成功
- if(res==0)
- {
- QMessageBox::warning(this, tr("提示!"),tr("注册成功!"),QMessageBox::Yes);
- //清空输入编辑框中的内容
- user_edit->clear();
- password_edit->clear();
- password_edit2->clear();
- //注册成功后就发送信号跳到登录
- back();
- }
- //res为1就注册失败,该用户存在
- else if(res==1)
- {
- QMessageBox::warning(this, tr("提示!"),tr("该用户已经存在!"),QMessageBox::Yes);
- //清空输入编辑框中的内容
- account_edit->clear();
- user_edit->clear();
- password_edit->clear();
- password_edit2->clear();
- }
- }
- else
- {
- QMessageBox::warning(this, tr("提示!"),tr("密码不一致!"),QMessageBox::Yes);
- //清空输入编辑框中的内容
- account_edit->clear();
- user_edit->clear();
- password_edit->clear();
- password_edit2->clear();
- //光标定位
- user_edit->setFocus();
- }
- }
- else
- {
- if(this->account_edit->text().length()<6)
- {
- QMessageBox::warning(this, tr("提示!"),tr("账号长度为6-10位!"),QMessageBox::Yes);
- }
- else if (this->user_edit->text().length()<6)
- {
- QMessageBox::warning(this, tr("提示!"),tr("用户名长度为6-10位!"),QMessageBox::Yes);
- }
- else if (this->password_edit->text().length()<6)
- {
- QMessageBox::warning(this, tr("提示!"),tr("密码长度为6-10位!"),QMessageBox::Yes);
- }
- else if (this->password_edit2->text().length()<6)
- {
- QMessageBox::warning(this, tr("提示!"),tr("密码长度为6-10位!"),QMessageBox::Yes);
- }
- //清空输入编辑框中的内容
- account_edit->clear();
- user_edit->clear();
- password_edit->clear();
- password_edit2->clear();
- //光标定位
- user_edit->setFocus();
- }
- }
- }
-
- //明文密文切换函数
- void RegisterWidget::PlainAndCipher()
- {
- //0是密文 1是明文
- if(this->mark==0)
- {
- this->password_edit->setEchoMode(QLineEdit::Normal);
- this->password_edit2->setEchoMode(QLineEdit::Normal);
- this->mark=1;
- }
- else if(this->mark==1)
- {
- this->password_edit->setEchoMode(QLineEdit::Password);
- this->password_edit2->setEchoMode(QLineEdit::Password);
- this->mark=0;
- }
- }
-
- //MD5加密处理
- QString RegisterWidget::GetMd5(const QString &value)
- {
- QString md5;
- QByteArray bb;
- bb = QCryptographicHash::hash(value.toUtf8(), QCryptographicHash::Md5);
- md5.append(bb.toHex());
- return md5;
- }

- #ifndef SINGELDB_H
- #define SINGELDB_H
- #include "sqlite3.h"//数据库
- #include <iostream>
- using namespace std;
-
- class SingelDB
- {
- public:
- // SingelDB();
- ~SingelDB();//析构
- static SingelDB *getInstance();//外部公共接口--获取model对象
- int dosql(char *sql,char **&result,int &row, int &col);//数据库执行
- void openDataBase(const char *dbPath);//打开数据库
- void closeDataBase();//关闭数据库
- private:
- SingelDB();//构造函数私有化
- static SingelDB *myDB;//静态私成员变量
- sqlite3 *sqldb;//数据库
- char *errmsg;//用来存储错误信息字符串
- };
-
- #endif // SINGELDB_H
- #include "singeldb.h"
-
- SingelDB *SingelDB::myDB=nullptr;
-
- //单例打开数据库路径
- SingelDB::SingelDB()
- {
- this->openDataBase("../data/video.db");//打开数据库
- }
-
- //外部公共接口--获取单例对象
- SingelDB *SingelDB::getInstance()
- {
- if(SingelDB::myDB==nullptr)
- {
- SingelDB::myDB=new SingelDB();
- }
- return SingelDB::myDB;
- }
-
- //数据库执行-查找数据
- int SingelDB::dosql(char *sql, char **&result, int &row, int &col)
- {
- int res =sqlite3_get_table(sqldb, sql, &result, &row, &col, &errmsg);
- if(res!=SQLITE_OK)
- {
- cout<<sqlite3_errmsg(sqldb)<<endl;
- return res;
- }
- return 0;
- }
-
- //打开数据库
- void SingelDB::openDataBase(const char *dbPath)
- {
- int res = sqlite3_open(dbPath, &sqldb);
- if(res != SQLITE_OK)
- {
- cout<<sqlite3_errmsg(sqldb)<<endl;
- cout<<sqlite3_errcode(sqldb)<<endl;
- }
- }
-
- //关闭数据库
- void SingelDB::closeDataBase()
- {
- int res = sqlite3_close(sqldb);
- if(res != SQLITE_OK)
- {
- cout<<sqlite3_errmsg(sqldb)<<endl;
- cout<<sqlite3_errcode (sqldb) <<endl;
- }
- }
-
-
- #ifndef USERCONTROL_H
- #define USERCONTROL_H
-
- #include <QString>
- #include "usermodel.h"//用户模型层
-
- class UserControl
- {
- public:
- static UserControl *getInstance();//外部公共接口 获取control对象
- int doLogin(QString account,QString pwd);//登录验证
- int doReister(QString account,QString user_name, QString pwd);//注册
- private:
- UserControl();//构造私有化
- static UserControl *contorl;//静态私成员变量
- };
-
- #endif // USERCONTROL_H
- #include "usercontrol.h"
-
- UserControl *UserControl::contorl=nullptr;
-
- //外部公共接口 获取control对象
- UserControl *UserControl::getInstance()
- {
- if(UserControl::contorl=nullptr)
- {
- UserControl::contorl=new UserControl();
- }
- return UserControl::contorl;
- }
-
- //登录验证,0表示验证成功,1表示验证失败
- int UserControl::doLogin(QString account, QString pwd)
- {
- return UserModel::getInstance()->getUserByNamePwd(account,pwd);
- }
-
- //注册
- int UserControl::doReister(QString account,QString user_name, QString pwd)
- {
- int res=UserModel::getInstance()->checkUserByNamePwd(account);
- //res为0说明用户存在
- if(res==1)
- {
- return UserModel::getInstance()->addUser(account,user_name,pwd);
- }
- //res为1说明用户不存在
- else
- {
- return -1;
- }
- }
-
- UserControl::UserControl()
- {
- }
-
- #ifndef USERMODEL_H
- #define USERMODEL_H
-
- #include <QString>//字符串
- #include <QDebug>//调试
- #include "singeldb.h"//数据库
- #include <iostream>
- using namespace std;
-
- class UserModel
- {
- public:
- static UserModel *getInstance();//外部公共接口 获取model对象
- int getUserByNamePwd(QString account,QString pwd);//对用户的用户名密码进行验证
- int addUser(QString account,QString user_name,QString pwd);//添加用户数据信息
- int checkUserByNamePwd(QString account);//判断用户是否存在
- private:
- UserModel();//构造函数私有化
- static UserModel *moder;//静态私成员变量
- sqlite3 *sqldb;//数据库
- char *errmsg;//用来存储错误信息字符串
- };
-
- #endif // USERMODEL_H
- #include "usermodel.h"
-
- UserModel *UserModel::moder =nullptr;
-
- UserModel::UserModel(){}
-
- //外部公共接口 获取model对象
- UserModel *UserModel::getInstance()
- {
- if(UserModel::moder==nullptr)
- {
- UserModel::moder=new UserModel;
- }
- return UserModel::moder;
- }
-
- //对用户的用户名密码进行验证
- int UserModel::getUserByNamePwd(QString account, QString pwd)
- {
- char sql[256];
- char **qres;
- int row,col;
- sprintf(sql,"select * from user where account='%s' AND password='%s';",
- account.toStdString().c_str(),pwd.toStdString().c_str());
- int res = SingelDB::getInstance()->dosql(sql,qres,row,col);
- //res为查询成功
- if(res==0)
- {
- //如果row大于0说明验证成功
- if(row>0)
- {
- return 0;
- }
- //反之说明验证失败
- else
- {
- return 1;
- }
- }
- //查询失败
- else
- {
- return -1;
- }
- }
-
- //判断用户是否存在
- int UserModel::checkUserByNamePwd(QString account)
- {
- char sql[256];
- sprintf(sql,"select * from user where account='%s';",
- account.toStdString().c_str());
- char **qres;
- int row,col;
- int res = SingelDB::getInstance()->dosql(sql,qres,row,col);
- if(res==0)
- {
- //如果row大于0用户存在
- if(row>0)
- {
- return 0;
- }
- //反之说明用户不存在
- else
- {
- return 1;
- }
- }
- //查询失败
- else
- {
- return -1;
- }
- }
-
- //添加用户数据信息
- int UserModel::addUser(QString account,QString user_name, QString pwd)
- {
- char sql[256];
- sprintf(sql,"insert into user(account,user_name,password)values('%s','%s','%s');",
- account.toStdString().c_str(),user_name.toStdString().c_str(),pwd.toStdString().c_str());
- char **qres;
- int row,col;
- return SingelDB::getInstance()->dosql(sql,qres,row,col);
- }