qt 学习(六) 数据库注册用户
做什么:
1 登陆按钮按下出现注册页面,
2 输入账号 判断是否可用 查询数据库,用户名是否已经注册
3 输入密码 判断密码格式
4 输入邮箱 判断邮箱格式 查询数据库,邮箱是否已经注册
做成什么样:
怎么做:
大体是这样的:
1画ui
2 lineedit 那一栏选择信号槽,发texted信号
3 创建数据库
4 编辑槽里的判断函数
具体是这样:
1 ui设计
2 数据库放在widget。h的头文件中, 方便系统各个模块调用数据内容。
下面创建数据库
调用数据库需要的头文件
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
创建数据库
:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
给库命名:
db.setDatabaseName("mayplestory.db");
插入表项:
query.exec(QObject::tr("create table mayplestory(id interger, name varchar(20), password varchar(20), email varchar(20));"));
数据库的模型就有了,下面就是配合ui lineEdit 进行相应的增加数据的内容, 不难的,只是有点繁琐。
我在学的时候遇到了一下几个问题
1 上次写的是在main函数中调用需要生成的界面,结果误认为不管谁要显示都要在main函数中创建该对象,再 对象.show()。以为login不能再显示新login。
谁调用谁建立对象:
这是完成regist 注册功能,在login对话框中
所以在login。cpp中加入registe。h 的头文件,就可以在login中创建有注册功能的对象了。
void loginDlg::on_registButton_clicked()
{
Regist w; w.exec();//谁调用就在谁处实现, login调用regist 就在 login处实现显示。
}
2 数据库初始为空时,用while(query.next()) 判断是否用户输入的用户名,在数据库中是否已有 结果query。next一开始就空下面的判断没有一个执行的,所以我少判断了初始为空的条件
if(query.first() == NULL) //数据库内容初始为空时
{
}
else
{
query.previous();//这一句很重要,不然判断还是有问题。
while(query.next()) //指向第一个
3 显示检测对话框的颜色不知道怎么设置, 问了网友才知道可以这样
ui->checkBox_3->setStyleSheet("color:green"); //字体变绿色
4 正则表达式没见过还得好好学习下, 邮箱的格式检测要用到
http://www.jb51.net/tools/zhengze.html
邮箱格式是:
regex pattern("([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)");
// 正则表达式,匹配规则:
// 第1组(即用户名),匹配规则:0至9、A至Z、a至z、下划线、点、连字符之中
// 的任意字符,重复一遍或以上(+ 表示重复1次以上)
// 中间,一个“@”符号
// 第二组(即域名),匹配规则:0至9或a至z之中的任意字符重复一遍或以上,
// 接着一个点,接着a至z之中的任意字符重复2至3遍(如com或cn等),
// 第二组内部的一组,一个点,接着a至z之中的任意字符重复2遍(如cn或fr等)
// 内部一整组重复零次或一次 代码 :
。h
#ifndef CONNECTION_H
#define CONNECTION_H #include <QDialog> namespace Ui {
class loginDlg;
} class loginDlg : public QDialog
{
Q_OBJECT public:
explicit loginDlg(QWidget *parent = );
~loginDlg(); private slots:
void on_loginBtn_clicked();
void on_registButton_clicked(); private:
Ui::loginDlg *ui; }; #endif // LOGINDLG_H
#ifndef REGIST_H
#define REGIST_H #include <QDialog>
#include <QString>
namespace Ui {
class Regist;
} class Regist : public QDialog
{
Q_OBJECT public:
explicit Regist(QWidget *parent = );
~Regist(); private slots: void on_sureButton_clicked(); void on_userEdit_textEdited(const QString &arg1); void on_passwordEdit_textEdited(const QString &arg1); void on_checkPasswordEdit_textEdited(const QString &arg1); void on_emailEdit_textEdited(const QString &arg1); private:
Ui::Regist *ui;
}; #endif // REGIST_H
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QDebug>
#include <QMessageBox>
#include <QCoreApplication>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mayplestory.db");
if(!db.open())
{
QMessageBox::critical(,qApp->tr("Cannot open database"),qApp->tr("unable to estabilished a database connection"),QMessageBox::Cancel);
return false;
} qDebug() << "created begin";
QSqlQuery query;
query.exec(QObject::tr("create table mayplestory(id interger, name varchar(20), password varchar(20), email varchar(20));"));
//query.exec(QObject::tr("insert into mayplestory values(0,'yuyuyu','123456');")); // query.exec("select *from information");
qDebug() << "created end" ;
return true; }
namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget(); private:
Ui::Widget *ui;
QSqlDatabase db; }; #endif // WIDGET_H
#include "logindlg.h"
#include "ui_logindlg.h"
#include <QtGui>
#include "widget.h"
#include "regist.h" loginDlg::loginDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::loginDlg)
{ ui->setupUi(this);
ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
//ui->pushButton->setFlat(true);
QObject::connect(ui->registButtton,SIGNAL(clicked()),this,SLOT(on_registButton_clicked()));
} loginDlg::~loginDlg()
{
delete ui;
} void loginDlg::on_loginBtn_clicked()//登陆界面函数
{ QSqlQuery query;
query.exec(QObject::tr("select * from mayplestory;")); while(query.next())
{ if(ui-> usrLineEdit->text().trimmed() == query.value()&& ui-> pwdLineEdit->text() == query.value() )
{
accept();
break;
}//比对数据库,ok进入主窗口
if (query.next() == NULL)
{
QMessageBox::warning(this,tr("Warning"),tr("user name or password error !!!"),QMessageBox::Yes);
ui->usrLineEdit->clear();
ui->pwdLineEdit->clear();
ui->usrLineEdit->setFocus();
} } } void loginDlg::on_registButton_clicked()
{ Regist w;
w.exec();//谁调用就在谁处实现, login调用regist 就在 login处实现显示。 }
#include <QtGui/QApplication>
#include <QTextCodec>
#include "widget.h"
#include "logindlg.h"
#include "regist.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb2312"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
Widget w; loginDlg login; //登陆窗口对象
if(!createConnection())
qDebug()<<"unconnect";
else
qDebug()<<"connect";
login.show();
//Regist x;
// x.show();
if(login.exec() == QDialog::Accepted)
{
w.show(); //通过后的主窗口
return a.exec();
}
else return ; }
#include "regist.h"
#include "ui_regist.h"
#include "widget.h"
#include <QPalette>
#include <QRegExp>
Regist::Regist(QWidget *parent) :
QDialog(parent),
ui(new Ui::Regist)
{
ui->setupUi(this); } Regist::~Regist()
{
delete ui;
}
int number = ;
QString insert = "";
QString value1;
QString value2;
QString value3; void Regist::on_sureButton_clicked()
{
QString exam = "";
if(exam == insert)
{
qDebug() << "regest now";
qDebug() << "" << value1 <<endl;
qDebug() << "" << value2 <<endl;
qDebug() << "" << value3 <<endl; QSqlQuery query;//
query.exec(QObject::tr("insert into mayplestory(id,name,password,email)values('%1','%2','%3','%4')").arg(number).arg(value1).arg(value2).arg(value3));
number++;
}
else
{
qDebug() << "regest can't";
}
} void Regist::on_userEdit_textEdited(const QString &arg1)
{ QString userName = ui->userEdit->text();
//qDebug() << userName;
QSqlQuery query; if( ( > userName.size()) || ( < userName.size()) )
{
ui->checkBox->setCheckable(true);
ui->checkBox->setChecked(false);
ui->checkBox->setStyleSheet("color:blue");
ui->checkBox->setText("用户名长度该在6-20个字符之间");
ui->checkBox->setCheckable(false);
}
else
{
qDebug() << userName.size();
query.exec(QObject::tr("select *from mayplestory"));
//qDebug()<< query.first();
if(query.first() == NULL)
{
qDebug()<< query.first();
ui->checkBox->setStyleSheet("color:green");
ui->checkBox->setText("该用户名可以使用");
ui->checkBox->setCheckable(true);
ui->checkBox->setChecked(true);
insert[] = '';
value1 = userName;
}
else
{
query.previous();
while(query.next())
{ QString NameInTable = query.value().toString();
if(userName == NameInTable)
{
ui->checkBox->setCheckable(true);
ui->checkBox->setChecked(false);
ui->checkBox->setStyleSheet("color:red");
ui->checkBox->setText("用户名已经被使用了");
ui->checkBox->setCheckable(false);
}
else
{
ui->checkBox->setCheckable(true);
ui->checkBox->setChecked(true);
ui->checkBox->setStyleSheet("color:green");
ui->checkBox->setText("该用户名可以使用");
//ui->checkBox->setCheckable(false);
insert[] = '';
value1 = userName;
qDebug() << "diyige" << insert;
return ;
}
}
}
}
} void Regist::on_passwordEdit_textEdited(const QString &arg1)
{
QString password = ui->passwordEdit->text();
if((password.size() < ) || (password.size() > ))
{ ui->checkBox_2->setCheckable(true);
ui->checkBox_2->setChecked(false);
ui->checkBox_2->setStyleSheet("color:red");
ui->checkBox_2->setText("密码长度应该在6-20个字符");
// ui->checkBox->setCheckable(false);
}
else
{
ui->checkBox_2->setCheckable(true);
ui->checkBox_2->setChecked(true);
ui->checkBox_2->setStyleSheet("color:green");
ui->checkBox_2->setText("密码长度适合");
insert[] = '';
qDebug() << "diyige" << insert;
}
} void Regist::on_checkPasswordEdit_textEdited(const QString &arg1)
{
QString checkPassword = ui->checkPasswordEdit->text();
QString password = ui->passwordEdit->text();
if((checkPassword.size() < ) || (checkPassword.size() > ))
{ ui->checkBox_3->setCheckable(true);
ui->checkBox_3->setChecked(false);
ui->checkBox_3->setStyleSheet("color:red");
ui->checkBox_3->setText("密码长度应该在6-20个字符");
// ui->checkBox->setCheckable(false);
}
else
{
ui->checkBox_3->setCheckable(true);
ui->checkBox_3->setChecked(false);
ui->checkBox_3->setStyleSheet("color:yellow");
ui->checkBox_3->setText("密码长度适合");
int temp = password.compare(checkPassword);
if(!temp)
{
ui->checkBox_3->setStyleSheet("color:green");
ui->checkBox_3->setText("密码与上一行吻合");
ui->checkBox_3->setChecked(true);
insert[] = '';
value2 = checkPassword;
qDebug() << "diyige" << insert;
}
else
{
ui->checkBox_3->setStyleSheet("color:red");
ui->checkBox_3->setText("与上一行输入的不同");
}
} } void Regist::on_emailEdit_textEdited(const QString &arg1)
{
QString emailAddress = ui->emailEdit->text();
QString userName, domainName;
QStringList list; QRegExp format("([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)");
//QRegExp exam;
int result = format.exactMatch(emailAddress);
if(result)
{ ui->checkBox_4->setStyleSheet("color:green");
ui->checkBox_4->setText("邮箱格式符合");
QSqlQuery query;
if(query.first() == NULL)
{
ui->checkBox_4->setCheckable(true);
ui->checkBox_4->setChecked(true);
ui->checkBox->setStyleSheet("color:green");
ui->checkBox_4->setText("该邮箱可以使用");
//ui->checkBox->setCheckable(false);
insert[] = '';
value3 = emailAddress;
}
else
{
query.exec(QObject::tr("select *from mayplestory"));
while(query.next())
{ QString NameInTable = query.value().toString();
if(userName == NameInTable)
{
ui->checkBox_4->setCheckable(true);
ui->checkBox_4->setChecked(false);
ui->checkBox_4->setStyleSheet("color:red");
ui->checkBox_4->setText("该邮箱已经被注册了");
ui->checkBox_4->setCheckable(false);
}
else
{
ui->checkBox_4->setCheckable(true);
ui->checkBox_4->setChecked(true);
ui->checkBox_4->setStyleSheet("color:green");
ui->checkBox_4->setText("该邮箱可以使用");
insert[] = '';
value3 = emailAddress;
qDebug() << "diyige" << insert;
//ui->checkBox->setCheckable(false);
return ;
}
}
}
}
else
{
ui->checkBox_4->setCheckable(true);
ui->checkBox_4->setChecked(false);
ui->checkBox_4->setStyleSheet("color:red");
ui->checkBox_4->setText("邮箱格式错误");
} //qDebug() << "result"<<result; }
#include "widget.h"
#include "ui_widget.h" Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{ ui->setupUi(this);
} Widget::~Widget()
{
delete ui;
}
qt 学习(六) 数据库注册用户的更多相关文章
- MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术
逻辑查询优化包括的技术 1)子查询优化 2)视图重写 3)等价谓词重写 4)条件简化 5)外连接消除 6)嵌套连接消除 7)连接消除 8)语义优化 9)非SPJ优化 一.子查询优化 1. ...
- Qt学习 之 数据库(支持10种数据库)
Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作.这里我们所说的“平台独立”,既包括操作系统平台,有包括各个数据库平台.另外,我们强调了“基于 SQL”,因为 NoSQL 数据 ...
- qt学习笔记(七)之数据库简介(所有支持数据库类型的列表)
笔者最近用Qt写公司的考勤机.本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手. 废话不 ...
- BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现
1.BBS项目之注册功能通过forms验证 from django import forms from blog.models import User from django.contrib.auth ...
- Qt 学习之路 2(58):编辑数据库外键
Qt 学习之路 2(58):编辑数据库外键(skip) 豆子 2013年7月12日 Qt 学习之路 2 13条评论 前面几章我们介绍了如何对数据库进行操作以及如何使用图形界面展示数据库数据.本章我们将 ...
- Qt 学习之路 2(57):可视化显示数据库数据
Qt 学习之路 2(57):可视化显示数据库数据(skip) 豆子 2013年6月26日 Qt 学习之路 2 26条评论 前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法.显然,使用QSq ...
- Qt 学习之路 2(56):使用模型操作数据库
Qt 学习之路 2(56):使用模型操作数据库 (okgogo: skip) 豆子 2013年6月20日 Qt 学习之路 2 13条评论 前一章我们使用 SQL 语句完成了对数据库的常规操作,包括简单 ...
- 一文带你学习DWS数据库用户权限设计与管理
前言 本文将介绍DWS基于RBAC(Role-Based Access Control,基于角色的访问控制)的数据库用户权限管理.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成 ...
- JavaEE学习之Spring Security3.x——模拟数据库实现用户,权限,资源的管理
一.引言 因项目需要最近研究了下Spring Security3.x,并模拟数据库实现用户,权限,资源的管理. 二.准备 1.了解一些Spring MVC相关知识: 2.了解一些AOP相关知识: 3. ...
随机推荐
- project 计划添加编号或 任务分解时为任务添加编号
[工具]-[选项]-[视图]-选择[显示大纲数字]-[确定]
- Vue的使用总结(1)
1.将某个对象赋值给vue实例中的data属性时是浅拷贝 var obj= { a: 1 } var vm = new Vue({ data: obj }) obj.a = 2; console.lo ...
- JS中的一些遍历方法
1.遍历数组 以下遍历方法中for循环性能最好,而且优化版for循环性能最高.只有forEach不能跳出循环. 在循环数组时,如果在循环过程中对数组进行了增删改,那么在后面的每次循环中,进行操作的都是 ...
- kafka-consumer.properties
# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreement ...
- ajax 封装(集中 认证、错误、请求loading处理)
一.为什么要对 ajax 进行封装: (在使用antd pro 开发项目时,里面默认是把请求进行了封装的,放在 utils/request.js 中.使用起来非常方便 https://pro ...
- 在RedHat中安装新字体
安装 下载这个字体. http://pan.baidu.com/s/1c23znaS 密码:tldo 在/usr/share/fonts/truetype/, 下建立一个新的目录 YaHei Cons ...
- LINUX shell脚本相关
调试脚本 测试脚本语法:bash -n file.sh 查看脚本每一步执行情况:bash -x file.sh 位置变量:$1,$2,... 特殊变量: %?:最后一个命令的执 ...
- C#-Newtonsoft.Json生成复杂JSON
官方文档:https://www.newtonsoft.com/json/help/html/SerializeObject.htm 一种方式就可以生成所有的 JSON Collection -> ...
- Asp.Net Core 第03局:Startup
总目录 前言 本文介绍Startup,它主要用于配置应用使用的服务和应用的请求管道. 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 第一手:Startup ...
- centos6.2 shutdown now关机进入单用户模式
在centos5.5时当我们输入 shutdown now 系统会进入关机状态.而centos6.2时并非如此,其他版本不清楚,而进入了单用户模式.(进入系统后想维护可做此操作.)会出现如下提示:(注 ...