Qt学习之路|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项目-安防监控系统(欢迎登录注册)
文章图片

1.myItem.h .cpp

#ifndef MYITEM_H #define MYITEM_H#include //触发信号槽机制 #include//图元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//图元绘制头文件 #include//测试定时器信号槽是否成功触发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正号向右移动 } }

2.myView.h .cpp
#ifndef MYVIEW_H #define MYVIEW_H#include //触发信号槽机制 #include//视图 #include//场景 #include"myitem.h"//图元 #include//定时器 - 图元移动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//测试定时器信号槽是否成功触发 #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(); } }

二:登录+注册 Qt学习之路|Qt项目-安防监控系统(欢迎登录注册)
文章图片
Qt学习之路|Qt项目-安防监控系统(欢迎登录注册)
文章图片

3.loginWidget.h .cpp
#ifndef LOGINWIDGET_H #define LOGINWIDGET_H#include "setcontrol.h" #include #include //标签文本 #include //按钮 #include //编辑框 #include //定时器 #include //对话框 #include //绘图 #include //可缩放图标 #include //消息框 #include//调试 #include //重绘事件 #include //生成密码散列 #include "usercontrol.h"//控制层 #include "registerwidget.h"//注册界面 #include//动态图 //#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 #include #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(temp + qrand()%26); } else if(num == 2) { //小写字母 int temp = 'a'; getcode += static_cast(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; }

4.RegisterWidget.h .cpp
#ifndef REGISTERWIDGET_H #define REGISTERWIDGET_H#include #include //标签文本 #include //按钮 #include //编辑框 #include //对话框 #include //绘图 #include //消息框 #include //按键事件 #include //正则 #include //生成密码散列 #include//动态图 #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 #include//分辨率 #include//消息框//注册界面构造函数 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; }

三:MVC设计模式-用户信息 【Qt学习之路|Qt项目-安防监控系统(欢迎登录注册)】Qt学习之路|Qt项目-安防监控系统(欢迎登录注册)
文章图片

5.SingelDB.h .cpp
#ifndef SINGELDB_H #define SINGELDB_H #include "sqlite3.h"//数据库 #include 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<

6.UserControl.h .cpp
#ifndef USERCONTROL_H #define USERCONTROL_H#include #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() { }

7.UserModel.h .cpp
#ifndef USERMODEL_H #define USERMODEL_H#include //字符串 #include //调试 #include "singeldb.h"//数据库 #include 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); }

    推荐阅读