目录
一:开机动画
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
一:开机动画
文章图片
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();
}
}
二:登录+注册
文章图片
文章图片
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项目-安防监控系统(欢迎登录注册)】
文章图片
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);
}
推荐阅读
- C++学习|C++从文件中提取英文单词
- Qt学习之路|Qt项目-安防监控系统(MVC设计模式)
- C语言学习|C语言做一个简易的登陆验证(功能)界面
- C和指针|C和指针 第6章 指针 6.4 间接访问操作符
- #|c++中的四种类型转换
- C++|C++中四种类型转换方式__笔记
- C++学习笔记|C++11常用特性
- 前端学习笔记|3.8 JavaScript-DOM节点
- 小白学java|室友打了俩把LOL,我知道了类是怎样加载的