注册聊天账号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(); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
用户评论