欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

注册聊天账号Register for chat account number_2,registernumber_2

来源: 开发者 投稿于  被查看 18634 次 评论:157

注册聊天账号Register for chat account number_2,registernumber_2


由于代码太多,上一个帖子篇幅太长,所以再开一个帖子说明一下注册聊天账号时的流程。首先要讲解main.cpp文件,因为在这个文件里创建了MySocket类(独立的通信线程),同时也创建了Login类(登录界面)以及之后通过login界面间接地创建了NewUser注册账号页面,通信线程和Login/NewUser页面的信号槽关系必须在main.cpp页面里写明。请参见下面代码:

main.cpp

#include "ModuleLogin/Login.h"
#include "Common/MySocket.h"

#include <QApplication>
#include <QThread>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //实例化MySocket类和线程类
    //需要考虑此2类内存的回收问题
    MySocket *mySocket=new MySocket;
    QThread *socketThread=new QThread;
    mySocket->moveToThread(socketThread);
    QObject::connect(socketThread,&QThread::started,
            mySocket,&MySocket::slot_initSocket);//网络Socket类的初始化

    //启动网络Socket次线程
    socketThread->start();

    //此处是否会造成内存泄漏???
    Login *login=new Login(mySocket);
    login->show();

    //Register new account number
    //注册
    QObject::connect(login,&Login::signal_msg501RegisterAcc,
                     mySocket,&MySocket::slot_msg501RegisterAcc);//注册账号
    QObject::connect(login,&Login::signal_msg501CancelRegister,
                     mySocket,&MySocket::slot_msg501CancelRegister);//取消注册账号
    QObject::connect(mySocket,&MySocket::signal_msg502RegAccSuccess,
                     login,&Login::signal_msg502RegAccSuccess);//注册账号成功

    return a.exec();
}

在login.cpp文件里,建立Login类和NewUser类之间的信号槽连接:


//此处在login页面保留一个NewUser类型的指针,如果该页面已经存在,则直接显示,不存在的时候,才新建
            NewUser *newUser=new NewUser(this);
            newUser->show();
            this->hide();

            connect(newUser,&NewUser::signal_msg501RegisterAcc,
                    this,&Login::signal_msg501RegisterAcc);
            connect(this,&Login::signal_msg502RegAccSuccess,
                    newUser,&NewUser::slot_msg502RegisterSuccess);

NewUser类的代码:


NewUser.h

#ifndef NEWUSER_H
#define NEWUSER_H

#include <QWidget>

class Login;
class QLineEdit;
class QLabel;
class QPushButton;
class ImageButton;

class NewUser : public QWidget
{
    Q_OBJECT
public:
    explicit NewUser(Login *login,QWidget *parent = 0);

signals:
    //注册
    void signal_msg501RegisterAcc(QByteArray datagram);//注册账号
    void signal_msg501CancelRegister();//取消注册

public slots:
    void slot_registerClicked();
    void slot_msg502RegisterSuccess(quint32 intAccNumber);//新账号注册成功

protected:
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *e);
    void keyReleaseEvent(QKeyEvent *e);

private:
    //To preserve the pointer of Login page, in order user want to get back to it
    //保留登录界面的指针,以便用户想再次返回该界面
    Login *m_login;

    ImageButton *btnReturn;
    QLineEdit *edtPwd;
    QLabel *lblInfo;
    QPushButton *btnRegister;

private:
    quint64 pwd1;//保存加密后的2段密码
    quint64 pwd2;
    quint8 intSex;
    quint8 intCalendar;
    quint16 intYear;
    quint8 intMonth;
    quint8 intDay;
    quint8 intNation;
    quint8 intProvince;
    quint16 intCity;
    QString strNickname;
    quint64 md51;//UserData的Md5值
    quint64 md52;

private:
    void ConvertMD5Pwd(QString strPwd,
                       quint64 &intPwd1,
                       quint64 &intPwd2);

private slots:
    void slot_btnReturnClicked();
};

#endif // NEWUSER_H

NewUser.cpp

#include "NewUser.h"
#include "Login.h"
#include "Common/ImageButton.h"

#include <QBoxLayout>
#include <QPainter>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QKeyEvent>
#include <QUuid>
#include <QCryptographicHash>
#include <QEvent>


NewUser::NewUser(Login *login, QWidget *parent) : QWidget(parent)
{
    //
    this->setAttribute(Qt::WA_AcceptTouchEvents);

    this->setAttribute(Qt::WA_DeleteOnClose);

    //Here preserve the pointer of Login page, lest user may click "BACK " key to return to Login page
    //此处保留Login登录界面的指针,以防用户点击“返回”键以便返回到先前的登录界面
    m_login=NULL;
    if(login!=NULL)
        m_login=login;

    //Return to previous page button
    //返回上一个页面按钮
    btnReturn=new ImageButton(QPixmap(":/images/left-arrow.png"),QPixmap(":/images/left-arrow_pressed.png"));
    btnReturn->setFixedSize(200,80);

    //Password
    //密码
    edtPwd=new QLineEdit;
    edtPwd->setFixedSize(this->width(),100);

    //Display prompt
    //显示提示信息
    lblInfo=new QLabel(tr("Please input your password: "));
    lblInfo->setFixedWidth(this->width());
    lblInfo->setStyleSheet("background:transparent");///

    //Register button
    //注册按钮
    btnRegister=new QPushButton(tr("Register"));
    btnRegister->setFixedWidth(this->width()-300);
    btnRegister->setFixedHeight(80);
    btnRegister->setStyleSheet("QPushButton{"
                            "border:0;"
                            "border-radius:6px;"
                            "background-color:QLinearGradient(x1:0,y1:0,x2:0,y2:1,stop:0 #f6f7fa, stop: 1 #dadbde);"
                            "}"
                            );

    //main layout of this page
    //主布局
    QVBoxLayout *main_layout=new QVBoxLayout;
    main_layout->addWidget(btnReturn,0,Qt::AlignLeft);
//    main_layout->addWidget(lblReturn,0,Qt::AlignLeft);
    main_layout->addWidget(lblInfo,0,Qt::AlignHCenter);
    main_layout->addWidget(edtPwd,0,Qt::AlignHCenter);
    main_layout->addWidget(btnRegister,0,Qt::AlignHCenter);
    main_layout->addStretch();
    main_layout->setMargin(0);
    main_layout->setSpacing(40);
    main_layout->setContentsMargins(0,40,0,0);

    this->setLayout(main_layout);

    //connect singals to slots
    //将信号连接到槽
    connect(btnRegister,&QPushButton::clicked,
            this,&NewUser::slot_registerClicked);
    connect(btnReturn,&QPushButton::clicked,
            this,&NewUser::slot_btnReturnClicked);
}

//register button clicked
//注册按钮被点击
void NewUser::slot_registerClicked()
{
    btnRegister->setEnabled(false);
    lblInfo->setText(tr(" contacting server, please be patient ... "));

    QByteArray datagram;
    QDataStream out(&datagram,QIODevice::WriteOnly);



    //to convert password into two inters, each takes up 8 bytes
    //将密码转换成2个8字节的数字
    ConvertMD5Pwd(this->edtPwd->text().trimmed(),
                  pwd1,
                  pwd2);
    //Icon of user default to 0
    //用户头像,默认为0
    quint8 intIcon=0;
    intSex=0;
    intCalendar=0;
    intYear=0;
    intMonth=0;
    intDay=0;
    intNation=0;
    intProvince=0;
    intCity=0;
    strNickname="User";

    //密保问题的3个回答
    QString strPwdProAns1="";
    QString strPwdProAns2="";
    QString strPwdProAns3="";

    QUuid outMark=QUuid::createUuid();
    out<<(quint16)(501)
        <<outMark
        <<pwd1
        <<pwd2
        <<intIcon//代表默认头像名称的数字,不超过256个。
        <<intSex//1表示男,0表示女
        <<intCalendar//1表示阳历,0表示阴历
        <<intYear
        <<intMonth
        <<intDay
        <<intNation
        <<intProvince
        <<intCity
        <<(quint8)0//密保问题和答案仅仅在服务器上保存,用户电脑无需保存
        <<(quint8)0
        <<(quint8)0
        <<md51
        <<md52
        <<strPwdProAns1
        <<strPwdProAns2
        <<strPwdProAns3
        <<strNickname
          ;

    emit signal_msg501RegisterAcc(datagram);
}


void NewUser::slot_msg502RegisterSuccess(quint32 intAccNumber)
{
    this->lblInfo->setText(QString(tr("Your Acc: %1"))
                           .arg(intAccNumber));
}

void NewUser::paintEvent(QPaintEvent *)
{
    //Background image of this page
    //本页面的背景图片
    QImage imgBackground(":/images/blue-background.jpg");
    QPainter painter(this);
    //Draw this widget
    //绘制窗体
    painter.drawPixmap(this->rect(), QPixmap::fromImage(imgBackground));
}

//The following two functions are to realize the "BACK" key function on Android
//If "BACK" key clicked, then return to the Login page
//以下两个函数为了实现安卓系统上的返回键,一旦返回键被按下,则返回登录界面
void NewUser::keyPressEvent(QKeyEvent *e)
{
    switch (e->key())
    {
    case Qt::Key_Back:
        e->accept();
        break;
    default:
        QWidget::keyPressEvent(e);
        break;
    }
}

void NewUser::keyReleaseEvent(QKeyEvent *e)
{
    switch (e->key())
    {
    case Qt::Key_Back:
        e->accept();
        if(m_login!=NULL)
            m_login->show();
        this->close();
        break;
    default:
        QWidget::keyReleaseEvent(e);
        break;
    }
}

//to encrypt users' password
//对用户密码进行加密
void NewUser::ConvertMD5Pwd(QString strPwd,
                            quint64 &intPwd1,
                            quint64 &intPwd2)
{
    //md5 encruption process of password
    //将密码进行md5加密处理
    QByteArray byte_array;
    byte_array.append(strPwd);
    QByteArray hash_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Md5);
    QString md5Pwd=hash_byte_array.toHex();

    //
    //首先将32位16进制数拆分成2组,每组16位,16进制数字必须以0x开头。
    QString str1=md5Pwd.mid(0,16);
    QString str2=md5Pwd.mid(16,16);

    //
    //将16进制的字符串转换成10进制的数字
    intPwd1=str1.toLongLong(0,16);
    intPwd2=str2.toLongLong(0,16);
}

//return to the previous page
//返回上一个页面
void NewUser::slot_btnReturnClicked()
{
    if(m_login!=NULL)
        m_login->show();
    this->close();
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关频道:

用户评论