zoukankan      html  css  js  c++  java
  • qt 学习(六) 数据库注册用户

      做什么:

    1 登陆按钮按下出现注册页面,

    2 输入账号  判断是否可用   查询数据库,用户名是否已经注册

    3 输入密码  判断密码格式

    4 输入邮箱  判断邮箱格式   查询数据库,邮箱是否已经注册

    做成什么样:

    image

    image

    怎么做:

    大体是这样的:

    1画ui

    2 lineedit 那一栏选择信号槽,发texted信号

    3 创建数据库

    4 编辑槽里的判断函数

    具体是这样:

    1 ui设计

    image

    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"); //字体变绿色

     

    正则表达式没见过还得好好学习下, 邮箱的格式检测要用到

               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
     1 #ifndef CONNECTION_H
     2 #define CONNECTION_H
     3 
     4 #include <QDialog>
     5 
     6 namespace Ui {
     7     class loginDlg;
     8 }
     9 
    10 class loginDlg : public QDialog
    11 {
    12     Q_OBJECT
    13 
    14 public:
    15     explicit loginDlg(QWidget *parent = 0);
    16     ~loginDlg();
    17 
    18 private slots:
    19     void on_loginBtn_clicked();
    20     void on_registButton_clicked();
    21 
    22 
    23 private:
    24     Ui::loginDlg *ui;
    25 
    26 };
    27 
    28 
    29 #endif // LOGINDLG_H
    View Code
     1 #ifndef REGIST_H
     2 #define REGIST_H
     3 
     4 #include <QDialog>
     5 #include <QString>
     6 namespace Ui {
     7     class Regist;
     8 }
     9 
    10 class Regist : public QDialog
    11 {
    12     Q_OBJECT
    13 
    14 public:
    15     explicit Regist(QWidget *parent = 0);
    16     ~Regist();
    17 
    18 private slots:
    19 
    20     void on_sureButton_clicked();
    21 
    22 
    23 
    24 
    25 
    26     void on_userEdit_textEdited(const QString &arg1);
    27 
    28     void on_passwordEdit_textEdited(const QString &arg1);
    29 
    30     void on_checkPasswordEdit_textEdited(const QString &arg1);
    31 
    32     void on_emailEdit_textEdited(const QString &arg1);
    33 
    34 private:
    35     Ui::Regist *ui;
    36 };
    37 
    38 #endif // REGIST_H
    View Code
     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3 
     4 #include <QWidget>
     5 #include <QtSql/QSqlDatabase>
     6 #include <QtSql/QSqlQuery>
     7 #include <QtSql/QSqlError>
     8 #include <QDebug>
     9 #include <QMessageBox>
    10 #include <QCoreApplication>
    11 static bool createConnection()
    12 {
    13     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    14     db.setDatabaseName("mayplestory.db");
    15     if(!db.open())
    16     {
    17         QMessageBox::critical(0,qApp->tr("Cannot open database"),qApp->tr("unable to estabilished a database connection"),QMessageBox::Cancel);
    18         return false;
    19     }
    20 
    21 
    22     qDebug() << "created begin";
    23     QSqlQuery query;
    24     query.exec(QObject::tr("create table mayplestory(id interger, name varchar(20), password varchar(20), email varchar(20));"));
    25     //query.exec(QObject::tr("insert into mayplestory values(0,'yuyuyu','123456');"));
    26 
    27 
    28     //  query.exec("select *from information");
    29     qDebug() << "created end" ;
    30     return true;
    31 
    32 }
    33 namespace Ui {
    34     class Widget;
    35 }
    36 
    37 class Widget : public QWidget
    38 {
    39     Q_OBJECT
    40 
    41 public:
    42     explicit Widget(QWidget *parent = 0);
    43     ~Widget();
    44 
    45 private:
    46     Ui::Widget *ui;
    47      QSqlDatabase db;
    48 
    49 };
    50 
    51 
    52 #endif // WIDGET_H
    View Code
    。cpp
     1 #include "logindlg.h"
     2 #include "ui_logindlg.h"
     3 #include <QtGui>
     4 #include "widget.h"
     5 #include "regist.h"
     6 
     7 
     8 loginDlg::loginDlg(QWidget *parent) :
     9     QDialog(parent),
    10     ui(new Ui::loginDlg)
    11 {
    12 
    13     ui->setupUi(this);
    14     ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
    15     //ui->pushButton->setFlat(true);
    16     QObject::connect(ui->registButtton,SIGNAL(clicked()),this,SLOT(on_registButton_clicked()));
    17 }
    18 
    19 
    20 loginDlg::~loginDlg()
    21 {
    22     delete ui;
    23 }
    24 
    25 void loginDlg::on_loginBtn_clicked()//登陆界面函数
    26 {
    27 
    28     QSqlQuery query;
    29     query.exec(QObject::tr("select * from mayplestory;"));
    30 
    31     while(query.next())
    32     {
    33 
    34         if(ui-> usrLineEdit->text().trimmed() ==  query.value(1)&& ui-> pwdLineEdit->text() == query.value(2)  )
    35          {
    36             accept();
    37             break;
    38          }//比对数据库,ok进入主窗口
    39             if (query.next() == NULL)
    40             {
    41                 QMessageBox::warning(this,tr("Warning"),tr("user name or password error !!!"),QMessageBox::Yes);
    42                 ui->usrLineEdit->clear();
    43                 ui->pwdLineEdit->clear();
    44                 ui->usrLineEdit->setFocus();
    45             }
    46 
    47     }
    48 
    49 }
    50 
    51 void loginDlg::on_registButton_clicked()
    52 {
    53 
    54     Regist w;
    55     w.exec();//谁调用就在谁处实现, login调用regist 就在 login处实现显示。
    56 
    57 }
    View Code
     1 #include <QtGui/QApplication>
     2 #include <QTextCodec>
     3 #include "widget.h"
     4 #include "logindlg.h"
     5 #include "regist.h"
     6 
     7 int main(int argc, char *argv[])
     8 {
     9         QApplication a(argc, argv);
    10         QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb2312"));
    11         QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb2312"));
    12         QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
    13         Widget w;
    14 
    15         loginDlg login;  //登陆窗口对象
    16         if(!createConnection())
    17             qDebug()<<"unconnect";
    18         else
    19               qDebug()<<"connect";
    20         login.show();
    21         //Regist x;
    22        // x.show();
    23         if(login.exec() == QDialog::Accepted)
    24         {
    25             w.show(); //通过后的主窗口
    26             return a.exec();
    27         }
    28         else return 0;
    29 
    30 
    31 }
    View Code
      1 #include "regist.h"
      2 #include "ui_regist.h"
      3 #include "widget.h"
      4 #include <QPalette>
      5 #include <QRegExp>
      6 Regist::Regist(QWidget *parent) :
      7     QDialog(parent),
      8     ui(new Ui::Regist)
      9 {
     10     ui->setupUi(this);
     11 
     12 }
     13 
     14 Regist::~Regist()
     15 {
     16     delete ui;
     17 }
     18 int number = 0;
     19 QString insert = "0000";
     20 QString value1;
     21 QString value2;
     22 QString value3;
     23 
     24 void Regist::on_sureButton_clicked()
     25 {
     26     QString exam = "1111";
     27     if(exam == insert)
     28     {
     29         qDebug() << "regest now";
     30         qDebug() << "1" << value1 <<endl;
     31         qDebug() << "2" << value2 <<endl;
     32         qDebug() << "3" << value3 <<endl;
     33 
     34     QSqlQuery query;//
     35     query.exec(QObject::tr("insert into mayplestory(id,name,password,email)values('%1','%2','%3','%4')").arg(number).arg(value1).arg(value2).arg(value3));
     36     number++;
     37     }
     38     else
     39     {
     40         qDebug() << "regest can't";
     41     }
     42 }
     43 
     44 
     45 
     46 void Regist::on_userEdit_textEdited(const QString &arg1)
     47 {
     48 
     49     QString userName = ui->userEdit->text();
     50     //qDebug() << userName;
     51     QSqlQuery query;
     52 
     53     if( (6 > userName.size()) || (20 < userName.size()) )
     54     {
     55         ui->checkBox->setCheckable(true);
     56         ui->checkBox->setChecked(false);
     57         ui->checkBox->setStyleSheet("color:blue");
     58         ui->checkBox->setText("用户名长度该在6-20个字符之间");
     59         ui->checkBox->setCheckable(false);
     60     }
     61     else
     62     {
     63         qDebug() << userName.size();
     64         query.exec(QObject::tr("select *from mayplestory"));
     65         //qDebug()<< query.first();
     66         if(query.first() == NULL)
     67         {
     68             qDebug()<< query.first();
     69             ui->checkBox->setStyleSheet("color:green");
     70             ui->checkBox->setText("该用户名可以使用");
     71             ui->checkBox->setCheckable(true);
     72             ui->checkBox->setChecked(true);
     73             insert[0] = '1';
     74             value1 = userName;
     75         }
     76         else
     77         {
     78             query.previous();
     79         while(query.next())
     80              {
     81 
     82                  QString NameInTable = query.value(1).toString();
     83                    if(userName == NameInTable)
     84                    {
     85                        ui->checkBox->setCheckable(true);
     86                        ui->checkBox->setChecked(false);
     87                        ui->checkBox->setStyleSheet("color:red");
     88                        ui->checkBox->setText("用户名已经被使用了");
     89                        ui->checkBox->setCheckable(false);
     90                    }
     91                    else
     92                    {
     93                        ui->checkBox->setCheckable(true);
     94                        ui->checkBox->setChecked(true);
     95                        ui->checkBox->setStyleSheet("color:green");
     96                        ui->checkBox->setText("该用户名可以使用");
     97                        //ui->checkBox->setCheckable(false);
     98                        insert[0] = '1';
     99                        value1 = userName;
    100                        qDebug() << "diyige" << insert;
    101                        return ;
    102                    }
    103              }
    104         }
    105     }
    106 }
    107 
    108 void Regist::on_passwordEdit_textEdited(const QString &arg1)
    109 {
    110     QString password = ui->passwordEdit->text();
    111     if((password.size() < 6) || (password.size() > 20))
    112     {
    113 
    114         ui->checkBox_2->setCheckable(true);
    115         ui->checkBox_2->setChecked(false);
    116         ui->checkBox_2->setStyleSheet("color:red");
    117         ui->checkBox_2->setText("密码长度应该在6-20个字符");
    118        // ui->checkBox->setCheckable(false);
    119     }
    120     else
    121     {
    122         ui->checkBox_2->setCheckable(true);
    123         ui->checkBox_2->setChecked(true);
    124         ui->checkBox_2->setStyleSheet("color:green");
    125         ui->checkBox_2->setText("密码长度适合");
    126         insert[1] = '1';
    127         qDebug() << "diyige" << insert;
    128     }
    129 }
    130 
    131 void Regist::on_checkPasswordEdit_textEdited(const QString &arg1)
    132 {
    133     QString checkPassword = ui->checkPasswordEdit->text();
    134     QString password = ui->passwordEdit->text();
    135     if((checkPassword.size() < 6) || (checkPassword.size() > 20))
    136     {
    137 
    138         ui->checkBox_3->setCheckable(true);
    139         ui->checkBox_3->setChecked(false);
    140         ui->checkBox_3->setStyleSheet("color:red");
    141         ui->checkBox_3->setText("密码长度应该在6-20个字符");
    142        // ui->checkBox->setCheckable(false);
    143     }
    144     else
    145     {
    146         ui->checkBox_3->setCheckable(true);
    147         ui->checkBox_3->setChecked(false);
    148         ui->checkBox_3->setStyleSheet("color:yellow");
    149         ui->checkBox_3->setText("密码长度适合");
    150         int temp = password.compare(checkPassword);
    151         if(!temp)
    152         {
    153             ui->checkBox_3->setStyleSheet("color:green");
    154             ui->checkBox_3->setText("密码与上一行吻合");
    155             ui->checkBox_3->setChecked(true);
    156             insert[2] = '1';
    157             value2 = checkPassword;
    158             qDebug() << "diyige" << insert;
    159         }
    160         else
    161             {
    162             ui->checkBox_3->setStyleSheet("color:red");
    163             ui->checkBox_3->setText("与上一行输入的不同");
    164             }
    165     }
    166 
    167 }
    168 
    169 void Regist::on_emailEdit_textEdited(const QString &arg1)
    170 {
    171         QString emailAddress = ui->emailEdit->text();
    172         QString userName, domainName;
    173         QStringList list;
    174 
    175         QRegExp format("([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)");
    176         //QRegExp exam;
    177         int result = format.exactMatch(emailAddress);
    178         if(result)
    179         {
    180 
    181             ui->checkBox_4->setStyleSheet("color:green");
    182             ui->checkBox_4->setText("邮箱格式符合");
    183             QSqlQuery query;
    184             if(query.first() == NULL)
    185             {
    186                 ui->checkBox_4->setCheckable(true);
    187                 ui->checkBox_4->setChecked(true);
    188                 ui->checkBox->setStyleSheet("color:green");
    189                 ui->checkBox_4->setText("该邮箱可以使用");
    190                 //ui->checkBox->setCheckable(false);
    191                 insert[3] = '1';
    192                 value3 = emailAddress;
    193             }
    194             else
    195             {
    196                 query.exec(QObject::tr("select *from mayplestory"));
    197                 while(query.next())
    198                  {
    199 
    200                      QString NameInTable = query.value(3).toString();
    201                        if(userName == NameInTable)
    202                        {
    203                            ui->checkBox_4->setCheckable(true);
    204                            ui->checkBox_4->setChecked(false);
    205                            ui->checkBox_4->setStyleSheet("color:red");
    206                            ui->checkBox_4->setText("该邮箱已经被注册了");
    207                            ui->checkBox_4->setCheckable(false);
    208                        }
    209                        else
    210                        {
    211                            ui->checkBox_4->setCheckable(true);
    212                            ui->checkBox_4->setChecked(true);
    213                            ui->checkBox_4->setStyleSheet("color:green");
    214                            ui->checkBox_4->setText("该邮箱可以使用");
    215                            insert[3] = '1';
    216                            value3 = emailAddress;
    217                            qDebug() << "diyige" << insert;
    218                            //ui->checkBox->setCheckable(false);
    219                            return ;
    220                        }
    221                   }
    222             }
    223         }
    224         else
    225         {
    226             ui->checkBox_4->setCheckable(true);
    227             ui->checkBox_4->setChecked(false);
    228             ui->checkBox_4->setStyleSheet("color:red");
    229             ui->checkBox_4->setText("邮箱格式错误");
    230         }
    231 
    232         //qDebug() << "result"<<result;
    233 
    234 
    235 }
    View Code
     1 #include "widget.h"
     2 #include "ui_widget.h"
     3 
     4 Widget::Widget(QWidget *parent) :
     5     QWidget(parent),
     6     ui(new Ui::Widget)
     7 {
     8 
     9     ui->setupUi(this);
    10 }
    11 
    12 Widget::~Widget()
    13 {
    14     delete ui;
    15 }
    View Code

    image

  • 相关阅读:
    VMware NAT 静态IP模式下上网
    无法连接虚拟设备 ide1:0
    C# ContainsKey与TryGetValue方法探究
    深入讲解以太坊的数据存储
    sqlserver之查询数据插入新建表@已存在表(oracle)
    python之列表、元祖、字典和数组的使用
    python之列表、元组、字典、数组对比
    python之ConfigParser介绍
    从业人员证券交易行为合规管理测试
    window系统自动设置时间同步脚本
  • 原文地址:https://www.cnblogs.com/mayplestory/p/4000979.html
Copyright © 2011-2022 走看看