目录
1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息
1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPushButton>
#include<QLineEdit>
#include<QLabel>
#include<QFont>
#include<QMessageBox>
#include<QDebug>
#include"second.h"
#include<QSqlDatabase> //数据库管理类
#include<QSqlQuery> //执行sql语句的类
#include<QSqlRecord> //数据库记录的类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
signals: //该权限下定义属于自己的信号
void my_signal(); //自定义一个无参无返回值的信号函数
void jump(); //自定义跳转的信号函数;
private slots:
void my_slot(); //自定义无参无返回值的槽函数
void my_slot1();
void my_slot3();
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QLabel* lab1;
QLabel* lab2;
QLabel* lab3;
QLineEdit* edit1;
QLineEdit* edit2;
QPushButton *btn1;
QPushButton *btn2;
QPushButton *btn3;
void on_quesBtn_clicked();
void on_critBtn_clicked();
void on_infoBtn_clicked();
QSqlDatabase db; //定义一个数据库的类对象
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setFixedSize(800,600); //设置固定尺寸
this->setWindowTitle("Widget"); //设置窗口标题
this->setWindowIcon(QIcon(":/wodepeizhenshi.png")); //设置窗口图标
//实例化标签
lab1=new QLabel(this);
lab1->setPixmap(QPixmap("D:\\qt23062\\day8\\logo.png")); //设置图片
lab1->setScaledContents(true); //设置图片自动适应大小
lab1->resize(800,270); //重新设置尺寸
//标签2
lab2=new QLabel(this);
lab2->setPixmap(QPixmap(":/userName.jpg")); //设置图片
lab2->setScaledContents(true); //设置图片自动适应大小
lab2->resize(60,60); //重新设置尺寸
lab2->move(200,300);
//标签3
lab3=new QLabel(this);
lab3->setPixmap(QPixmap(":/passwd.jpg")); //设置图片
lab3->setScaledContents(true); //设置图片自动适应大小
lab3->resize(60,60); //重新设置尺寸
lab3->move(lab2->x(),lab2->y()+90);
//行编辑器
edit1=new QLineEdit("",this);
edit1->setPlaceholderText("账号");
edit1->move(lab2->x()+75,lab2->y());
edit1->resize(360,60);
edit2=new QLineEdit("",this);
edit2->setPlaceholderText("密码");
edit2->move(lab3->x()+75,lab3->y());
edit2->resize(360,60);
edit2->setEchoMode(QLineEdit::Password); //设置回显模式
//按钮
btn1=new QPushButton(QIcon(":/login.png"),"登录",this);
btn1->move(edit2->x()+50,edit2->y()+100);
btn1->resize(110,70); //重新设置尺寸
QFont font = btn1->font();
font.setPointSize(16); // 设置字体大小为16像素
btn1->setFont(font);
QPushButton *btn2=new QPushButton(QIcon(":/cancel.png"),"取消",this);
btn2->move(btn1->x()+150,btn1->y());
btn2->resize(110,70); //重新设置尺寸
QFont font1 = btn2->font();
font1.setPointSize(16); // 设置字体大小为16像素
btn2->setFont(font1);
btn3=new QPushButton("注册",this);
btn3->move(btn1->x()-150,btn1->y());
btn3->resize(110,70);
QFont font2 = btn3->font();
font2.setPointSize(16); // 设置字体大小为16像素
btn3->setFont(font2);
//连接
connect(btn3, &QPushButton::clicked, this, &Widget::my_slot3);
connect(btn1, &QPushButton::clicked, this, &Widget::my_slot);
connect(btn2, &QPushButton::clicked, this, &Widget::my_slot1);
connect(this,&Widget::my_signal,this,&Widget::close);
//判断自己的数据库对象中,是否包含了要处理的数据库,如果没有包含,则添加一个数据库,如果包含了,就可以打开了
if(!db.contains("mydatabase.db"))
{
//添加一个数据库,调用该类中的静态成员函数
//函数原型 static QSqlDatabase addDatabase(const QString& type)
db=QSqlDatabase::addDatabase("QSQLITE");
//设置数据库的名字
db.setDatabaseName("mydatabase.db");
}
//此时已经有一个名为mydatabase.db的数据库
//打开数据库
if(!db.open())
{
QMessageBox::information(this,"失败","数据库打开失败");
return;
}
//需要使用sql语句进行创建表的操作
//准备sql语句
QString sql="create table if not exists id (" //创建表
"acc varchar(20) primary key," //账号,主键
"pas varchar20)"; //密码
//准备语句执行着
QSqlQuery querry;
//让语句执行者执行sql语句
//返回值bool类型
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","创建表失败");
return;
}
}
Widget::~Widget()
{
delete ui;
}
//槽函数
void Widget::my_slot()
{
QString sql="select * from id";
QSqlQuery querry;
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","系统错误");
return ;
}
int flag=0;
while(querry.next())
{
if(edit1->text()==querry.record().value(0).toString()&&querry.record().value(1).toString()==edit2->text())
{
on_infoBtn_clicked(); //登入成功函数
flag=1;
break;
}
}
if(0==flag)
{
//错误对话框
on_critBtn_clicked();
}
}
void Widget::my_slot1()
{
//问题对话框
on_quesBtn_clicked();
}
void Widget::my_slot3()
{
//注册数据
//获取ui界面中要录入的数据
QString acc=edit1->text(); //账号
QString pas=edit2->text(); //密码
//确保每个编辑器中都有数据
if(acc.isEmpty()||pas.isEmpty())
{
QMessageBox::information(this,"提示","请将信息填写完整");
return;
}
//准备sql语句
QString sql=QString("insert into id(acc,pas)"
"values('%1','%2')").arg(acc).arg(pas);
// qDebug()<<sql;
//准备语句执行者
QSqlQuery querry;
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","注册失败");
return ;
}else
{
QMessageBox::information(this,"成功","注册成功");
}
}
//问题对话框
void Widget::on_quesBtn_clicked()
{
//1.调用构造函数实例化对象
QMessageBox box(QMessageBox::Question, //图标
"问题对话框", //对话框标题
"是否确定要退出登入", //对话框文本内容
QMessageBox::Yes|QMessageBox::No, //提供的按钮
this); //父组件
//box.setDetailedText("有上好的飞天茅台"); //提供详细文本内容
//box.setDefaultButton(QMessageBox::No); //将no设置成默认按钮
//2.调用exec函数运行对话框
int ret=box.exec();
//3.对结果进行判断
if(ret==QMessageBox::Yes)
{
emit my_signal();
}else if(ret==QMessageBox::No)
{
}
}
//信息对话框
void Widget::on_infoBtn_clicked()
{
//直接调用静态成员函数完成对话框的实现
int ret=QMessageBox::information(this, //父组件
"信息对话框", //对话框标题
"登入成功", //对话框文本内容
QMessageBox::Ok, //对话框提供的按钮
QMessageBox::Ok); //默认选中的按钮
if (ret==QMessageBox::Ok)
{
emit my_signal();
emit jump();
}
}
//错误对话框
void Widget::on_critBtn_clicked()
{
//1.调用构造函数实例化对象
QMessageBox box(QMessageBox::Critical, //图标
"错误对话框", //对话框标题
"账号密码不匹配,是否重新登入", //对话框文本内容
QMessageBox::Yes|QMessageBox::No, //提供的按钮
this); //父组件
//box.setDetailedText("账号密码不匹配,是否重新登入"); //提供详细文本内容
//box.setDefaultButton(QMessageBox::No); //将no设置成默认按钮
box.setButtonText(QMessageBox::Yes,"OK");
box.setButtonText(QMessageBox::No,"cancel");
//2.调用exec函数运行对话框
int ret=box.exec();
//3.对结果进行判断
if(ret==QMessageBox::Yes)
{
edit2->clear();
}else if(ret==QMessageBox::No)
{
emit my_signal();
}
}
second.h
#ifndef SECOND_H
#define SECOND_H
#include <QWidget>
namespace Ui {
class Second;
}
class Second : public QWidget
{
Q_OBJECT
public slots:
void jump_slot(); //接收跳转信号的槽函数
public:
explicit Second(QWidget *parent = nullptr);
~Second();
private:
Ui::Second *ui;
};
#endif // SECOND_H
second.cpp
#include "second.h"
#include "ui_second.h"
Second::Second(QWidget *parent) :
QWidget(parent),
ui(new Ui::Second)
{
ui->setupUi(this);
}
Second::~Second()
{
delete ui;
}
//接收跳转信号对应的槽函数
void Second::jump_slot()
{
this->show(); //
}