註冊聊天帳號Register for chat account number_2,registernumber_2

來源:互聯網
上載者:User

註冊聊天帳號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();}


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.