1.登录注册和数据库联动
三个头文件
#ifndef DEMO_H
#define DEMO_H
#include <QWidget>
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery> //执行sql语句的类
#include <QSqlRecord> //数据库记录的类
#include <QMessageBox> //消息对话框
namespace Ui {
class demo;
}
class demo : public QWidget
{
Q_OBJECT
public slots:
void jump_slots();
public:
explicit demo(QWidget *parent = nullptr);
~demo();
private:
Ui::demo *ui;
};
#endif // DEMO_H
#ifndef DEMO_ZC_H
#define DEMO_ZC_H
#include <QWidget>
#include <QDebug> //信息调试类,用于输出数据使用
#include<QIcon> //图标头文件
#include <QPushButton> //按钮头文件
#include<QLineEdit> //行类头文件
#include<QLabel> //标签头文件
#include <QCheckBox> //多选框头文件
#include <QMessageBox> //对话框头文件
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery> //执行sql语句的类
#include <QSqlRecord> //数据库记录的类
#include <QMessageBox> //消息对话框
namespace Ui {
class demo_zc;
}
class demo_zc : public QWidget
{
Q_OBJECT
public slots:
void jumpzc_slots();
public:
explicit demo_zc(QWidget *parent = nullptr);
~demo_zc();
private slots:
void on_cancelBtn_clicked();
void on_zcBtn_clicked();
private:
Ui::demo_zc *ui;
QSqlDatabase db; //定义一个数据库的类对象
};
#endif // DEMO_ZC_H
#ifndef MYWIDGET_H
#define MYWIDGET_H //防止文件重复引用
#include <QWidget> //父类的头文件
#include <QDebug> //信息调试类,用于输出数据使用
#include<QIcon> //图标头文件
#include <QPushButton> //按钮头文件
#include<QLineEdit> //行类头文件
#include<QLabel> //标签头文件
#include <QCheckBox> //多选框头文件
#include <QMessageBox> //对话框头文件
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery> //执行sql语句的类
#include <QSqlRecord> //数据库记录的类
#include <QMessageBox> //消息对话框
#include "demo.h"
#include "demo_zc.h"
QT_BEGIN_NAMESPACE
namespace Ui { class myWidget; } //声明ui界面对应的头文件中的命名空间,这里不需要,注释掉
QT_END_NAMESPACE
//自定义了myWidget类,公共继承了Qwidget类
class myWidget : public QWidget
{
Q_OBJECT //信号与槽的元对象,没有这个对象,信号与槽就不能使用了
signals:
void jump();
void jump_zc();
//槽函数
public slots:
void on_bn_dl_clicked();
void on_bn_qx_clicked();
void on_bn_zczh_clicked();
//公共函数
public:
myWidget(QWidget *parent = nullptr); //构造函数的声明
~myWidget(); //析构函数的声明
//私有成员
private:
// Ui::myWidget *ui; //可以通过该指针调用ui界面上拖拽出来的组件,这里不用,注释掉
QLineEdit *mm;
QLineEdit *zh;
QPushButton *bn_dl;
QPushButton *bn_qx;
QPushButton *bn_zczh;
demo *demo1;
demo_zc *demo_zc1;
QSqlDatabase db; //定义一个数据库的类对象
};
#endif // MYWIDGET_H
三个源文件:
#include "demo.h"
#include "ui_demo.h"
void demo::jump_slots()
{
this->show();
}
demo::demo(QWidget *parent) :
QWidget(parent),
ui(new Ui::demo)
{
ui->setupUi(this);
}
demo::~demo()
{
delete ui;
}
#include "demo_zc.h"
#include "ui_demo_zc.h"
void demo_zc::jumpzc_slots()
{
this->show();
}
demo_zc::demo_zc(QWidget *parent) :
QWidget(parent),
ui(new Ui::demo_zc)
{
ui->setupUi(this);
//判断自己的数据库对象中,是否包含要处理的数据库,如果没有包含则添加一个数据库,如果包含了,就可以打开了
if(!db.contains("mydatabase.db"))
{
//则添加一个数据库,调用类中的静态成员函数addDatabase
//函数原型:static QSqlDatabase addDatabase(const QString& type);
//参数:驱动类型
//返回值:数据库对象
db=QSqlDatabase::addDatabase("QSQLITE");
//设置数据库的名字
db.setDatabaseName("mydatabase.db");
}
//此时已经有一个名为mydatabase.db的数据库
//打开数据库
if(!db.open())
{
QMessageBox::information(this,"失败","数据库打开失败");
return;
}
}
demo_zc::~demo_zc()
{
delete ui;
}
//关闭注册界面
void demo_zc::on_cancelBtn_clicked()
{
this->hide();
}
//注册账号,把账号添加到数据库中
void demo_zc::on_zcBtn_clicked()
{
//获取ui界面中要录入的数据
QString QQid=ui->zhEdit->text();
QString mm=ui->mmEdit->text();
//确保每个编辑器中都有数据
if(QQid.isEmpty()||mm.isEmpty())
{
QMessageBox::information(this,"提示","请将信息填写完整");
return;
}
//准备sql语句
QString sql=QString("insert into zhanghao(QQid,password) "
"values('%1','%2')").arg(QQid).arg(mm);
// qDebug()<<sql;
//准备语句执行者
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::warning(this,"失败","注册失败");
return;
}else
{
QMessageBox::information(this,"成功","注册成功");
}
}
#include "mywidget.h"
//#include "ui_mywidget.h"
myWidget::myWidget(QWidget *parent)
: QWidget(parent) //显行调用父类的有参构造完成对子类从父类继承下来成员的初始化工作
// , ui(new Ui::myWidget) //给自己类中的指针成员初始化空间,ui界面中拖拽出来的组件在这个对象中,这里不用,注释掉
{
// ui->setupUi(this); //调用ui::myWidget里面的成员函数,给拖拽的组件实例化空间,并设置相关属性,这里不用, 注释掉
//这里开始写所有界面设置
//设置大窗口属性
this->setFixedSize(530,399);//设置固定尺寸
this->setWindowTitle("时光QQ"); //设置当前的窗口标题
this->setWindowIcon(QIcon(":/icon/shiguang02.jpg")); //设置当前窗口的标题图标
this->setStyleSheet("background-color:green;");
//设置一个图形标签
QLabel *picture1=new QLabel(this);
picture1->resize(530,160);
picture1->setPixmap(QPixmap(":/icon/00859H3cgy1hg9dl79dqpj32yo1o01ky.jpg"));
picture1->setScaledContents(true);
//设置登录图标
QLabel *p1=new QLabel(this);
p1->resize(60,50);
p1->move(80,180);
p1->setPixmap(QPixmap(":/icon/shiguang03.png"));
p1->setScaledContents(true);
//设置密码图标
QLabel *p2=new QLabel(this);
p2->resize(60,50);
p2->move(p1->x(),p1->y()+80);
p2->setPixmap(QPixmap(":/icon/shiguang01.jpg"));
p2->setScaledContents(true);
//设置登录行
this->zh=new QLineEdit(this);
zh->resize(300,50);
zh->move(p1->x()+75,p1->y());
zh->setStyleSheet("background-color:0;");
zh->setPlaceholderText("请输入用户名");
//设置密码行
this->mm=new QLineEdit(this);
mm->resize(300,50);
mm->move(p2->x()+75,p2->y());
mm->setStyleSheet("background-color:0;");
mm->setPlaceholderText("请输入密码");
mm->setEchoMode(QLineEdit::Password);
// //自动登录和记住密码
// QCheckBox *chb1=new QCheckBox(this);
// chb1->setText("自动登录");
// chb1->move(mm->x()+30,mm->y()+65);
// QCheckBox *chb2=new QCheckBox(this);
// chb2->setText("记住密码");
// chb2->move(chb1->x()+160,chb1->y());
// 注册账号
this->bn_zczh=new QPushButton(this);
bn_zczh->setIcon(QIcon("D://Qt-project//HUAQING23062//day8//icon//shiguang02.jpg"));
bn_zczh->setText("注册");
bn_zczh->setStyleSheet("background-color:white");
bn_zczh->move(mm->x()-80,mm->y()+95);
bn_zczh->resize(80,35);
//登录按钮
this->bn_dl=new QPushButton(this);
bn_dl->setIcon(QIcon("D://Qt-project//HUAQING23062//day8//icon//shiguang02.jpg"));
bn_dl->setText("登录");
bn_dl->setStyleSheet("background-color:#138;");
bn_dl->move(mm->x()+30,mm->y()+95);
bn_dl->resize(80,35);
//取消按钮
this->bn_qx=new QPushButton(this);
bn_qx->setIcon(QIcon("D://Qt-project//HUAQING23062//day8//icon//shiguang02.jpg"));
bn_qx->setText("取消");
bn_qx->setStyleSheet("background-color:#831;");
bn_qx->move(bn_dl->x()+160,bn_dl->y());
bn_qx->resize(80,35);
//连接登录按钮的点击信号和槽函数
connect(bn_dl,&QPushButton::clicked,this,&myWidget::on_bn_dl_clicked);
//连接取消按钮的点击信号和槽函数
connect(bn_qx,&QPushButton::clicked,this,&myWidget::on_bn_qx_clicked);
//连接注册按钮的点击信号和槽函数
connect(bn_zczh,&QPushButton::clicked,this,&myWidget::on_bn_zczh_clicked);
demo1=new demo;
//连接跳转信号和隔壁槽函数
connect(this,&myWidget::jump,demo1,&demo::jump_slots);
demo_zc1=new demo_zc;
//连接跳转信号和隔壁槽函数
connect(this,&myWidget::jump_zc,demo_zc1,&demo_zc::jumpzc_slots);
//判断自己的数据库对象中,是否包含要处理的数据库,如果没有包含则添加一个数据库,如果包含了,就可以打开了
if(!db.contains("mydatabase.db"))
{
//则添加一个数据库,调用类中的静态成员函数addDatabase
//函数原型:static QSqlDatabase addDatabase(const QString& type);
//参数:驱动类型
//返回值:数据库对象
db=QSqlDatabase::addDatabase("QSQLITE");
//设置数据库的名字
db.setDatabaseName("mydatabase.db");
}
//此时已经有一个名为mydatabase.db的数据库
//打开数据库
if(!db.open())
{
QMessageBox::information(this,"失败","数据库打开失败");
return;
}
//需要使用sql语句进行创建表的操作
//准备aql语句
QString sql="create table if not exists zhanghao("
"QQid varchar(16) primary key," //账号
"password varchar(16))"; //密码
//准备语句执行者
QSqlQuery query;
//让语句执行者执行sql语句
//函数原型:bool exec(const QString& query);
//参数:要执行的sql语句
//返回值:成功执行返回true,失败返回false
if(!query.exec(sql))
{
QMessageBox::information(this,"失败","创建表失败");
return;
}
}
myWidget::~myWidget()
{
// delete ui; //释放指针空间,这里没有用到,注释掉
}
//定义登录按钮的槽函数
void myWidget::on_bn_dl_clicked()
{
QString username,psd;
username=zh->text();
psd=mm->text();
//准备aql语句
QString sql = QString("select * from zhanghao where QQid='%1' AND password='%2'").arg(username).arg(psd);
//准备语句执行者
QSqlQuery querry;
//执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"错误","账号或密码错误!");
return;
}
if(querry.record().count()>0)
{
//对象版
QMessageBox masg_login;
masg_login.setIcon(QMessageBox::Information);
masg_login.setInformativeText("点击ok后,将关闭整个登录界面,\n然后跳转到登录后的界面");
masg_login.setWindowTitle("登录成功");
masg_login.setStandardButtons(QMessageBox::Ok);
masg_login.setDefaultButton(QMessageBox::Ok);
int ret = masg_login.exec(); //展示对话框
if(ret==QMessageBox::Ok)
{
qDebug()<<"111";
// this->demo1->show();
this->hide();
emit jump();
// this->demo1->show();
}
}else {
//静态成员函数版
int ret=QMessageBox::critical(this, "登录错误",
"账号密码不匹配,是否重新登录",
QMessageBox::Ok|QMessageBox::Cancel);
if(ret==QMessageBox::Ok)
{
zh->clear();
mm->clear();
}else if(ret==QMessageBox::Cancel)
{
this->close();
}
}
}
//定义取消按钮的槽函数
void myWidget::on_bn_qx_clicked()
{
//静态成员函数版
int ret=QMessageBox::question(this, "提示",
"是否确定要退出登录?",
QMessageBox::Yes|QMessageBox::No);
if(ret==QMessageBox::No)
{
bn_dl->click();
}else if(ret==QMessageBox::Yes)
{
this->close();
}
}
//定义注册按钮的槽函数
void myWidget::on_bn_zczh_clicked()
{
//静态成员函数版
int ret=QMessageBox::question(this, "提示",
"是否确定要进入注册账号页面?",
QMessageBox::Yes|QMessageBox::No);
if(ret==QMessageBox::Yes)
{
emit jump_zc();
}else if(ret==QMessageBox::No)
{
// this->close();
qDebug()<<"用户取消进入注册\n";
}
}
主函数运行文件:
#include "mywidget.h" //引入自定义图形化界面类的头文件
#include <QApplication> //引入应用程序类的头文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//使用应用程序类,实例化一个应用程序的对象
myWidget w;
//用自定义的图形化界面类实例化一个对象
w.show();
//调用show函数展示界面,父类提供的,可以展示自己的组件,以自己作为父组件的所有子组件也会被展示出来
return a.exec();
//阻塞等待应用程序,防止应用程序结束,等待用户操作、等待信号与槽、等待事件发生
}
运行结果: