註冊聊天帳號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_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_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();}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。