QML与C++交互:登陆界面设计

QML与C++交互:登陆界面设计


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN7

开发环境:Qt5.2.1


说明:

QML设计前台界面,C++后台负责逻辑


效果图:




源代码:


前台qml文件

login.qml

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /********************************************************************* 
  2. *                            登陆界面qml文件 
  3. *                       (c)copyright 2014,jdh 
  4. *                         All Right Reserved 
  5. *新建日期:2014/4/29 by jdh 
  6. *修改日期:2014/4/30 by jdh 
  7. *修改日期:2014/5/4 by jdh 
  8. *修改日期:2014/5/5 by jdh 
  9. **********************************************************************/  
  10.   
  11. import QtQuick 2.0  
  12. import "content"  
  13. import Login_Gui 1.0  
  14.   
  15. Rectangle  
  16. {  
  17.     id: login  
  18.     width: 320; height: 512  
  19.     SystemPalette { id: activePalette }  
  20.   
  21.     //C++组件:用户界面  
  22.     Login_Gui  
  23.     {  
  24.         id:login_gui  
  25.         onSig_login_result:  
  26.         {  
  27.             //关闭登陆动画  
  28.             load_gif.opacity = 0  
  29.   
  30.             //根据登陆结果处理  
  31.             switch (result)  
  32.             {  
  33.             //登陆成功  
  34.             case 0:  
  35.                 message.text = "登陆成功"  
  36.                 message.opacity = 1  
  37.                 break;  
  38.             //无此用户名  
  39.             case 1:  
  40.                 message.text = "登陆失败:无此用户名"  
  41.                 message.opacity = 1  
  42.                 break;  
  43.             //密码错误  
  44.             case 2:  
  45.                 message.text = "登陆失败:密码错误"  
  46.                 message.opacity = 1  
  47.                 break;  
  48.             //达到最大登陆次数  
  49.             case 3:  
  50.                 message.text = "登陆失败:达到最大登陆次数"  
  51.                 message.opacity = 1  
  52.                 break;  
  53.             }  
  54.         }  
  55.     }  
  56.   
  57.     //背景图片  
  58.     Image  
  59.     {  
  60.         id: background  
  61.         anchors { top: parent.top; bottom: parent.bottom }  
  62.         anchors.fill: parent  
  63.         source: "pics/pic1.png"  
  64.         fillMode: Image.PreserveAspectCrop  
  65.     }  
  66.   
  67.     //消息框  
  68.     Message  
  69.     {  
  70.         id: message  
  71.         font_size: login.height * 0.03  
  72.         anchors {centerIn: parent}  
  73.         opacity: 0  
  74.     }  
  75.   
  76.     //登陆动画  
  77.     AnimatedImage  
  78.     {  
  79.         id: load_gif; source: "pics/load.gif"  
  80.         anchors {horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter}  
  81.         z: 100  
  82.         opacity: 0  
  83.     }  
  84.   
  85.     //顶栏  
  86.     Item  
  87.     {  
  88.         id: top_bar  
  89.         width: login.width; height: login.height * 0.06  
  90.         anchors.top: parent.top  
  91.   
  92.         Text  
  93.         {  
  94.             id: title  
  95.             anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }  
  96.             //text: "登陆"  
  97.             text: "登陆"  
  98.             font.bold: true  
  99.             font.pointSize: login.height * 0.06 * 0.4  
  100.             color: "dark red"  
  101.         }  
  102.     }  
  103.   
  104.     //空白栏  
  105.     Item  
  106.     {  
  107.         id: space1  
  108.         width: login.width; height: login.height * 0.1  
  109.         anchors.top: top_bar.bottom  
  110.     }  
  111.   
  112.     //登陆框  
  113.     Rectangle  
  114.     {  
  115.         id: rect1  
  116.         width: login.width * 0.8; height: login.height * 0.3  
  117.         anchors { top: space1.bottom; horizontalCenter: parent.horizontalCenter }  
  118.         border.color: "#707070"  
  119.         color: "transparent"  
  120.         radius: 8  
  121.   
  122.         Row  
  123.         {  
  124.             spacing: rect1.width * 0.05  
  125.   
  126.             Item  
  127.             {  
  128.                 width: rect1.width * 0.05; height: rect1.height  
  129.             }  
  130.   
  131.             Column  
  132.             {  
  133.                 spacing: rect1.height * 0.025  
  134.   
  135.                 Item  
  136.                 {  
  137.                     width: rect1.width * 0.8; height: rect1.height * 0.05  
  138.                 }  
  139.   
  140.                 LineInput  
  141.                 {  
  142.                     id: txt_user_id  
  143.                     width: rect1.width * 0.8; height: rect1.height * 0.2  
  144.                     font_size:height * 0.7  
  145.                     //anchors {horizontalCenter: rect1.horizontalCenter; top: rect1.top; topMargin: 8}  
  146.                     hint: "请输入用户号"  
  147.                     text:login_gui.user_id  
  148.                 }  
  149.   
  150.                 LineInput  
  151.                 {  
  152.                     id: txt_password  
  153.                     width: rect1.width * 0.8; height: rect1.height * 0.2  
  154.                     font_size:height * 0.7  
  155.                     //anchors {horizontalCenter: rect1.horizontalCenter; bottom: btn_login.top;  bottomMargin: rect1.height * 0.1}  
  156.                     hint: "请输入密码"  
  157.                     text:login_gui.password  
  158.                 }  
  159.   
  160.                 Row  
  161.                 {  
  162.                     spacing: rect1.width * 0.1  
  163.                     Button  
  164.                     {  
  165.                         id: btn_login  
  166.                         width: rect1.width * 0.35; height: rect1.height * 0.2  
  167.                         //anchors { left: rect1.left; leftMargin: 28; bottom: rect1.bottom; bottomMargin: 8 }  
  168.                         text: "登陆"  
  169.                         onClicked: login_req()  
  170.                     }  
  171.   
  172.                     Button  
  173.                     {  
  174.                         id: btn_quit  
  175.                         width: rect1.width * 0.35; height: rect1.height * 0.2  
  176.                         //anchors { right: rect1.right; rightMargin: 28; bottom: rect1.bottom; bottomMargin: 8 }  
  177.                         text: "退出"  
  178.                         onClicked:  
  179.                         {  
  180.                             Qt.quit();  
  181.                         }  
  182.                     }  
  183.                 }  
  184.   
  185.                 Row  
  186.                 {  
  187.                     spacing: rect1.width * 0.1  
  188.   
  189.                     CheckBox  
  190.                     {  
  191.                         id: check1  
  192.                         width: rect1.width * 0.35; height: rect1.height * 0.2  
  193.                         //anchors { left: rect1.left; top: rect1.bottom }  
  194.                         caption: "记住密码"  
  195.                         selected: login_gui.flag_remember  
  196.                     }  
  197.   
  198.                     CheckBox  
  199.                     {  
  200.                         id: check2  
  201.                         width: rect1.width * 0.35; height: rect1.height * 0.2  
  202.                         //anchors { right: rect1.right; top: rect1.bottom }  
  203.                         caption: "自动登陆"  
  204.                         selected: login_gui.flag_auto  
  205.                     }  
  206.                 }  
  207.             }  
  208.         }  
  209.     }  
  210.   
  211.     //android自带键处理  
  212.     FocusScope  
  213.     {  
  214.         focus: true  
  215.   
  216.         Keys.onReleased:  
  217.         {  
  218.             if (event.key == Qt.Key_Back)  
  219.             {  
  220.                 console.log("qml login quit")  
  221.                 login.sig_btn_quit()  
  222.             }  
  223.         }  
  224.     }  
  225.   
  226.     //登陆请求函数  
  227.     function login_req()  
  228.     {  
  229.         //判断用户名是否有效  
  230.         if (txt_user_id.text == "")  
  231.         {  
  232.             message.text = "请输入用户名"  
  233.             message.opacity = 1  
  234.             return  
  235.         }  
  236.   
  237.         //判断密码是否有效  
  238.         if (txt_password.text == "")  
  239.         {  
  240.             message.text = "请输入密码"  
  241.             message.opacity = 1  
  242.             return  
  243.         }  
  244.   
  245.         //显示登陆动画  
  246.         load_gif.opacity = 1  
  247.   
  248.         //登陆请求  
  249.         login_gui.user_id = txt_user_id.text  
  250.         login_gui.password = txt_password.text  
  251.         login_gui.flag_remember = check1.selected  
  252.         login_gui.flag_auto = check2.selected  
  253.         login_gui.slot_login_req()  
  254.     }  
  255.   
  256. //    //信号槽绑定  
  257. //    Component.onCompleted:  
  258. //    {  
  259. //        login_gui.sig_user_id_changed.connect(login_gui.slot_btn_login)  
  260. //    }  
  261. }  

后台C++代码

main.c

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /********************************************************************* 
  2. *                               主文件 
  3. *                       (c)copyright 2014,jdh 
  4. *                         All Right Reserved 
  5. *新建日期:2014/1/27 by jdh 
  6. *修改日期:2014/1/28 by jdh 
  7. *修改日期:2014/2/4 by jdh 
  8. *修改日期:2014/2/18 by jdh 
  9. *修改日期:2014/2/27 by jdh 
  10. *修改日期:2014/2/28 by jdh 
  11. *修改日期:2014/3/1 by jdh 
  12. *修改日期:2014/4/10 by jdh 
  13. *修改日期:2014/5/4 by jdh 
  14. **********************************************************************/  
  15.   
  16. #include "world.h"  
  17. #include "main_gui.h"  
  18. #include "login_gui.h"  
  19. #include "light_gui.h"  
  20. #include "heart_beat.h"  
  21. #include "net.h"  
  22. #include "data_sync_center.h"  
  23. #include "set_ctrl_state.h"  
  24.   
  25. int main(int argc, char *argv[])  
  26. {  
  27.     QGuiApplication app(argc, argv);  
  28.   
  29.     //注册组件到QML  
  30.     qmlRegisterType<Login_Gui>("Login_Gui", 1, 0, "Login_Gui");  
  31.   
  32.     QtQuick2ApplicationViewer viewer;  
  33.     viewer.setMainQmlFile(QStringLiteral("qml/SH_User/login.qml"));  
  34.     viewer.showExpanded();  
  35.   
  36.     return app.exec();  
  37. }  

login_gui.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /********************************************************************* 
  2. *                           登陆界面模块头文件 
  3. *                       (c)copyright 2014,jdh 
  4. *                         All Right Reserved 
  5. *新建日期:2014/1/29 by jdh 
  6. *修改日期:2014/2/1 by jdh 
  7. *修改日期:2014/2/18 by jdh 
  8. *修改日期:2014/3/18 by jdh 
  9. *修改日期:2014/5/4 by jdh 
  10. *修改日期:2014/5/5 by jdh 
  11. *修改日期:2014/5/13 by jdh 
  12. **********************************************************************/  
  13.   
  14. #ifndef LOGIN_GUI_H  
  15. #define LOGIN_GUI_H  
  16.   
  17. /********************************************************************* 
  18. *                               头文件 
  19. **********************************************************************/  
  20.   
  21. #include "world.h"  
  22.   
  23. /********************************************************************* 
  24. *                               宏定义 
  25. **********************************************************************/  
  26.   
  27. /********************************************************************* 
  28. *                               登录间隔 
  29. *单位:ms 
  30. **********************************************************************/  
  31.   
  32. #define INTERVAL_LOGIN          500  
  33.   
  34. /********************************************************************* 
  35. *                               最大登录次数 
  36. **********************************************************************/  
  37.   
  38. #define NUM_LOGIN               5  
  39.   
  40. /********************************************************************* 
  41. *                               数据结构 
  42. **********************************************************************/  
  43.   
  44. /********************************************************************* 
  45. *                               登录界面类 
  46. **********************************************************************/  
  47.   
  48. class Login_Gui : public QObject  
  49. {  
  50.     Q_OBJECT  
  51.   
  52.     //属性:用户名  
  53.     Q_PROPERTY(QString user_id READ user_id WRITE set_user_id NOTIFY sig_user_id_changed)  
  54.     //属性:密码  
  55.     Q_PROPERTY(QString password READ password WRITE set_password NOTIFY sig_password_changed)  
  56.     //属性:记住密码标志  
  57.     Q_PROPERTY(bool flag_remember READ flag_remember \  
  58.                WRITE set_flag_remember NOTIFY sig_flag_remember_changed)  
  59.     //属性:自动登录标志  
  60.     Q_PROPERTY(bool flag_auto READ flag_auto \  
  61.                WRITE set_flag_auto NOTIFY sig_flag_auto_changed)  
  62.   
  63. public:  
  64.   
  65.     /********************************************************************* 
  66.     *                           函数 
  67.     **********************************************************************/  
  68.   
  69.     /********************************************************************* 
  70.     *                           初始化函数 
  71.     **********************************************************************/  
  72.   
  73.     Login_Gui();  
  74.   
  75.     /********************************************************************* 
  76.     *                           解构函数 
  77.     **********************************************************************/  
  78.   
  79.     ~Login_Gui();  
  80.   
  81.     /********************************************************************* 
  82.     *                           属性读取:用户号 
  83.     **********************************************************************/  
  84.   
  85.     QString user_id();  
  86.   
  87.     /********************************************************************* 
  88.     *                           属性写入:用户号 
  89.     **********************************************************************/  
  90.   
  91.     void set_user_id(QString str);  
  92.   
  93.     /********************************************************************* 
  94.     *                           属性读取:密码 
  95.     **********************************************************************/  
  96.   
  97.     QString password();  
  98.   
  99.     /********************************************************************* 
  100.     *                           属性写入:密码 
  101.     **********************************************************************/  
  102.   
  103.     void set_password(QString str);  
  104.   
  105.     /********************************************************************* 
  106.     *                           属性读取:记住密码标志 
  107.     **********************************************************************/  
  108.   
  109.     bool flag_remember();  
  110.   
  111.     /********************************************************************* 
  112.     *                           属性写入:记住密码标志 
  113.     **********************************************************************/  
  114.   
  115.     void set_flag_remember(bool flag);  
  116.   
  117.     /********************************************************************* 
  118.     *                           属性读取:自动登陆标志 
  119.     **********************************************************************/  
  120.   
  121.     bool flag_auto();  
  122.   
  123.     /********************************************************************* 
  124.     *                           属性写入:自动登陆标志 
  125.     **********************************************************************/  
  126.   
  127.     void set_flag_auto(bool flag);  
  128.   
  129. signals:  
  130.   
  131.     /********************************************************************* 
  132.     *                           属性改变信号:用户号 
  133.     **********************************************************************/  
  134.   
  135.     void sig_user_id_changed();  
  136.   
  137.     /********************************************************************* 
  138.     *                           属性改变信号:密码 
  139.     **********************************************************************/  
  140.   
  141.     void sig_password_changed();  
  142.   
  143.     /********************************************************************* 
  144.     *                           属性改变信号:记住密码标志 
  145.     **********************************************************************/  
  146.   
  147.     void sig_flag_remember_changed();  
  148.   
  149.     /********************************************************************* 
  150.     *                           属性改变信号:自动登陆标志 
  151.     **********************************************************************/  
  152.   
  153.     void sig_flag_auto_changed();  
  154.   
  155.     /********************************************************************* 
  156.     *                           信号:登陆结果 
  157.     *参数:result:0:成功 
  158.     *           1:无此用户名 
  159.     *           2:密码错误 
  160.     *           3:达到登陆的最大次数 
  161.     **********************************************************************/  
  162.   
  163.     void sig_login_result(int result);  
  164.   
  165.     /********************************************************************* 
  166.     *                               发送网络帧 
  167.     *参数:id:用户名 
  168.     *    password:密码 
  169.     *    cmd:帧命令 
  170.     *    index:发送序列号 
  171.     *    frame:发送的报文 
  172.     **********************************************************************/  
  173.   
  174.     void sig_net_tx_frame_with_id(uint32_t id,uint32_t password,int cmd,uint16_t index,QByteArray frame);  
  175.   
  176. public slots:  
  177.   
  178.     /********************************************************************* 
  179.     *                           槽函数:登陆请求 
  180.     **********************************************************************/  
  181.   
  182.     void slot_login_req();  
  183.   
  184.     /********************************************************************* 
  185.     *                           槽函数:登陆响应 
  186.     *参数:data:接收的数据 
  187.     **********************************************************************/  
  188.   
  189.     void slot_login_ack(QByteArray data);  
  190.   
  191. private slots:  
  192.   
  193.     /********************************************************************* 
  194.     *                           槽函数:心跳滴答函数 
  195.     *说明:1滴答触发1次 
  196.     **********************************************************************/  
  197.   
  198.     void slot_tick();  
  199.   
  200. private:  
  201.   
  202.     /********************************************************************* 
  203.     *                           变量 
  204.     **********************************************************************/  
  205.   
  206.     /********************************************************************* 
  207.     *                           属性:用户号 
  208.     **********************************************************************/  
  209.   
  210.     QString _user_id;  
  211.   
  212.     /********************************************************************* 
  213.     *                           属性:密码 
  214.     **********************************************************************/  
  215.   
  216.     QString _password;  
  217.   
  218.     /********************************************************************* 
  219.     *                           属性:记住密码标志 
  220.     **********************************************************************/  
  221.   
  222.     bool _flag_remember;  
  223.   
  224.     /********************************************************************* 
  225.     *                           属性:自动登录标志 
  226.     **********************************************************************/  
  227.   
  228.     bool _flag_auto;  
  229.   
  230.     /********************************************************************* 
  231.     *                           滴答定时器 
  232.     **********************************************************************/  
  233.   
  234.     QTimer *timer;  
  235.   
  236.     /********************************************************************* 
  237.     *                           登录计数器 
  238.     **********************************************************************/  
  239.   
  240.     int Login_Counter;  
  241. };  
  242.   
  243. #endif // LOGIN_GUI_H  

login_gui.c

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /********************************************************************* 
  2. *                           登陆界面模块主文件 
  3. *                       (c)copyright 2014,jdh 
  4. *                         All Right Reserved 
  5. *新建日期:2014/1/29 by jdh 
  6. *修改日期:2014/2/1 by jdh 
  7. *修改日期:2014/2/17 by jdh 
  8. *修改日期:2014/2/18 by jdh 
  9. *修改日期:2014/2/16 by jdh 
  10. *修改日期:2014/5/4 by jdh 
  11. *修改日期:2014/5/5 by jdh 
  12. *修改日期:2014/5/13 by jdh 
  13. **********************************************************************/  
  14.   
  15. /********************************************************************* 
  16. *                           头文件 
  17. **********************************************************************/  
  18.   
  19. #include "login_gui.h"  
  20.   
  21. /********************************************************************* 
  22. *                           函数 
  23. **********************************************************************/  
  24.   
  25. /********************************************************************* 
  26. *                           初始化函数 
  27. **********************************************************************/  
  28.   
  29. Login_Gui::Login_Gui()  
  30. {  
  31.     //初始化变量  
  32.     Login_Counter = 0;  
  33.   
  34.     //滴答初始化  
  35.     timer = new QTimer(this);  
  36.     //绑定信号槽  
  37.     connect(timer, SIGNAL (timeout()), this , SLOT(slot_tick()));  
  38.   
  39.     QFile file_cfg("cfg.txt");  
  40.     QByteArray arr;  
  41.     bool ok;  
  42.     int flag_remember = 0;  
  43.     int flag_auto_login = 0;  
  44.     int id = 0;  
  45.     int password = 0;  
  46.     QString str;  
  47.     int i = 0;  
  48.     int j = 0;  
  49.   
  50.     //属性初始化  
  51.     _user_id = "";  
  52.     _password = "";  
  53.     _flag_remember = false;  
  54.     _flag_auto = false;  
  55.   
  56.     //判断文件是否存在  
  57.     if (!file_cfg.exists())  
  58.     {  
  59.         file_cfg.close();  
  60.     }  
  61.     else  
  62.     {  
  63.         //文件存在  
  64.         file_cfg.open(QIODevice::ReadOnly);  
  65.         //读取文件  
  66.         do  
  67.         {  
  68.             str.clear();  
  69.             arr = file_cfg.readLine();  
  70.             for (i = 0;i < arr.count();i++)  
  71.             {  
  72.                 if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \  
  73.                     (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \  
  74.                      arr.at(i) == 'x')  
  75.                 {  
  76.                     str[j++] = arr.at(i);  
  77.                 }  
  78.             }  
  79.             flag_remember = str.toInt(&ok,16);  
  80.             if (!ok)  
  81.             {  
  82.                 break;  
  83.             }  
  84.   
  85.             str.clear();  
  86.             arr = file_cfg.readLine();  
  87.             for (i = 0;i < arr.count();i++)  
  88.             {  
  89.                 if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \  
  90.                     (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \  
  91.                      arr.at(i) == 'x')  
  92.                 {  
  93.                     str[j++] = arr.at(i);  
  94.                 }  
  95.             }  
  96.             flag_auto_login = str.toInt(&ok,16);  
  97.             if (!ok)  
  98.             {  
  99.                 break;  
  100.             }  
  101.   
  102.             str.clear();  
  103.             arr = file_cfg.readLine();  
  104.             for (i = 0;i < arr.count();i++)  
  105.             {  
  106.                 if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \  
  107.                     (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \  
  108.                      arr.at(i) == 'x')  
  109.                 {  
  110.                     str[j++] = arr.at(i);  
  111.                 }  
  112.             }  
  113.             id = str.toInt(&ok,16);  
  114.             if (!ok)  
  115.             {  
  116.                 break;  
  117.             }  
  118.   
  119.             str.clear();  
  120.             arr = file_cfg.readLine();  
  121.             for (i = 0;i < arr.count();i++)  
  122.             {  
  123.                 if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \  
  124.                     (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \  
  125.                      arr.at(i) == 'x')  
  126.                 {  
  127.                     str[j++] = arr.at(i);  
  128.                 }  
  129.             }  
  130.             password = str.toInt(&ok,16);  
  131.             if (!ok)  
  132.             {  
  133.                 break;  
  134.             }  
  135.   
  136.             //判断是否记住密码  
  137.             if (flag_remember == VALID_FLAG)  
  138.             {  
  139.                 _user_id = QString::number(id,10);  
  140.                 _password = QString::number(password,10);  
  141.                 _flag_remember = true;  
  142.   
  143.                 //判断是否自动登录  
  144.                 if (flag_auto_login == VALID_FLAG)  
  145.                 {  
  146.                     _flag_auto = true;  
  147.                     slot_login_req();  
  148.                 }  
  149.             }  
  150.         } while (0);  
  151.   
  152.         file_cfg.close();  
  153.     }  
  154. }  
  155.   
  156. /********************************************************************* 
  157. *                           解构函数 
  158. **********************************************************************/  
  159.   
  160. Login_Gui::~Login_Gui()  
  161. {  
  162. }  
  163.   
  164. /********************************************************************* 
  165. *                           属性读取:用户号 
  166. **********************************************************************/  
  167.   
  168. QString Login_Gui::user_id()  
  169. {  
  170.     return _user_id;  
  171. }  
  172.   
  173. /********************************************************************* 
  174. *                           属性写入:用户号 
  175. **********************************************************************/  
  176.   
  177. void Login_Gui::set_user_id(QString str)  
  178. {  
  179.     if (_user_id != str)  
  180.     {  
  181.         _user_id = str;  
  182.         emit sig_user_id_changed();  
  183.     }  
  184. }  
  185.   
  186. /********************************************************************* 
  187. *                           属性读取:密码 
  188. **********************************************************************/  
  189.   
  190. QString Login_Gui::password()  
  191. {  
  192.     return _password;  
  193. }  
  194.   
  195. /********************************************************************* 
  196. *                           属性写入:密码 
  197. **********************************************************************/  
  198.   
  199. void Login_Gui::set_password(QString str)  
  200. {  
  201.     if (_password != str)  
  202.     {  
  203.         _password = str;  
  204.         emit sig_password_changed();  
  205.     }  
  206. }  
  207.   
  208. /********************************************************************* 
  209. *                           属性读取:记住密码标志 
  210. **********************************************************************/  
  211.   
  212. bool Login_Gui::flag_remember()  
  213. {  
  214.     return _flag_remember;  
  215. }  
  216.   
  217. /********************************************************************* 
  218. *                           属性写入:记住密码标志 
  219. **********************************************************************/  
  220.   
  221. void Login_Gui::set_flag_remember(bool flag)  
  222. {  
  223.     if (_flag_remember != flag)  
  224.     {  
  225.         _flag_remember = flag;  
  226.         emit sig_flag_remember_changed();  
  227.     }  
  228. }  
  229.   
  230. /********************************************************************* 
  231. *                           属性读取:自动登陆标志 
  232. **********************************************************************/  
  233.   
  234. bool Login_Gui::flag_auto()  
  235. {  
  236.     return _flag_auto;  
  237. }  
  238.   
  239. /********************************************************************* 
  240. *                           属性写入:自动登陆标志 
  241. **********************************************************************/  
  242.   
  243. void Login_Gui::set_flag_auto(bool flag)  
  244. {  
  245.     if (_flag_auto != flag)  
  246.     {  
  247.         _flag_auto = flag;  
  248.         emit sig_flag_auto_changed();  
  249.     }  
  250. }  
  251.   
  252. /********************************************************************* 
  253. *                           槽函数:登陆请求 
  254. **********************************************************************/  
  255.   
  256. void Login_Gui::slot_login_req()  
  257. {     
  258.     //初始化计数器  
  259.     Login_Counter = 0;  
  260.     //开始尝试登陆  
  261.     timer->start(INTERVAL_LOGIN);  
  262.     slot_tick();  
  263. }  
  264.   
  265. /********************************************************************* 
  266. *                           槽函数:登陆响应 
  267. *参数:data:接收的数据 
  268. **********************************************************************/  
  269.   
  270. void Login_Gui::slot_login_ack(QByteArray data)  
  271. {  
  272.     uint32_t id = 0;  
  273.     uint32_t password = 0;  
  274.     int flag_remember = 0;  
  275.     int flag_auto_login = 0;  
  276.     uint8_t result = 0;  
  277.     bool ok;  
  278.   
  279. #ifdef DEBUG  
  280.     qDebug() << "接收帧:尝试登陆" << (uint8_t)data[0] << (uint8_t)data[1] << (uint8_t)data[2];  
  281. #endif  
  282.   
  283.     //清除计数器  
  284.     Login_Counter = 0;  
  285.     //停止登录尝试  
  286.     timer->stop();  
  287.   
  288.     //判断用户号和密码是否匹配  
  289.     id = ((uint8_t)data[6] << 24) +\  
  290.          ((uint8_t)data[7] << 16) + \  
  291.          ((uint8_t)data[8] << 8) + \  
  292.           (uint8_t)data[9];  
  293.     password = ((uint8_t)data[10] << 24) +\  
  294.                ((uint8_t)data[11] << 16) + \  
  295.                ((uint8_t)data[12] << 8) + \  
  296.                 (uint8_t)data[13];  
  297.     //登陆结果  
  298.     result = (uint8_t)data[LEN_FRAME_HEAD];  
  299.     //判断登陆结果  
  300.     switch (result)  
  301.     {  
  302.         //登陆成功  
  303.     case 0:  
  304.         {  
  305.             //判断用户名和密码是否正确  
  306.             if (id == (uint32_t)_user_id.toInt(&ok) && password == (uint32_t)_password.toInt(&ok))  
  307.             {  
  308.                 //发送登陆成功信号  
  309.                 emit sig_login_result(0);  
  310.   
  311.             #ifdef DEBUG  
  312.                 qDebug() << "登陆成功" << "用户号" << _user_id << "密码" << _password;  
  313.             #endif  
  314.   
  315.                 //判断是否勾选记住密码以及自动登录  
  316.                 if (_flag_remember)  
  317.                 {  
  318.                     flag_remember = VALID_FLAG;  
  319.                 }  
  320.                 if (_flag_auto)  
  321.                 {  
  322.                     flag_auto_login = VALID_FLAG;  
  323.                 }  
  324.   
  325.                 //将用户名密码保存  
  326.                 QFile file_cfg("cfg.txt");  
  327.                 file_cfg.open(QIODevice::WriteOnly);  
  328.                 QTextStream out(&file_cfg);  
  329.                 out << QString::number(flag_remember,16) << "\r\n" \  
  330.                     << QString::number(flag_auto_login,16) << "\r\n" \  
  331.                     << _user_id << "\r\n" \  
  332.                     << _password << "\r\n";  
  333.                 file_cfg.close();  
  334.             }  
  335.   
  336.             break;  
  337.         }  
  338.         //无此用户名  
  339.     case 1:  
  340.         {  
  341.         #ifdef DEBUG  
  342.             qDebug() << "登陆失败" << "用户号不存在";  
  343.         #endif  
  344.   
  345.             //发送登录失败信号  
  346.             emit sig_login_result(1);  
  347.   
  348.             break;  
  349.         }  
  350.         //密码错误  
  351.     case 2:  
  352.         {  
  353.         #ifdef DEBUG  
  354.             qDebug() << "登陆失败" << "密码错误";  
  355.         #endif  
  356.   
  357.             //发送登录失败信号  
  358.             emit sig_login_result(2);  
  359.   
  360.             break;  
  361.         }  
  362.     }  
  363. }  
  364.   
  365. /********************************************************************* 
  366. *                           槽函数:心跳滴答函数 
  367. *说明:1滴答触发1次 
  368. **********************************************************************/  
  369.   
  370. void Login_Gui::slot_tick()  
  371. {  
  372.     QByteArray frame;  
  373.     bool ok;  
  374.   
  375.     //登录计数器  
  376.     Login_Counter++;  
  377.     if (Login_Counter > NUM_LOGIN)  
  378.     {  
  379.     #ifdef DEBUG  
  380.         qDebug() << "登录失败" << "达到最大尝试登陆次数:" << NUM_LOGIN;  
  381.     #endif  
  382.   
  383.         //清除计数器  
  384.         Login_Counter = 0;  
  385.   
  386.         //停止登陆尝试  
  387.         timer->stop();  
  388.         //发送登陆失败信号  
  389.         emit sig_login_result(3);  
  390.   
  391.         return;  
  392.     }  
  393.   
  394.     //发送登陆请求  
  395.     //报文  
  396.     frame.clear();  
  397.     //发送网络帧  
  398. #ifdef DEBUG  
  399.     qDebug() << "发送帧:发送登陆请求";  
  400. #endif  
  401.     emit sig_net_tx_frame_with_id((uint32_t)_user_id.toInt(&ok),(uint32_t)_password.toInt(&ok),\  
  402.                                   CMD_USER_LOGIN_REQUEST,0,frame);  
  403. }  


FROM: http://blog.csdn.net/jdh99/article/details/25774797


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值