由于代码太多,上一个帖子篇幅太长,所以再开一个帖子说明一下注册聊天账号时的流程。首先要讲解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_OBJECTpublic: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_HNewUser.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//用户头像,默认为0quint8 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();}
版权声明:本文为博主原创文章,未经博主允许不得转载。
命运掌握在自己手中