zoukankan      html  css  js  c++  java
  • 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.      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.          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.          login.width; height: login.height * 0.1  
    109.         anchors.top: top_bar.bottom  
    110.     }  
    111.   
    112.     //登陆框  
    113.     Rectangle  
    114.     {  
    115.         id: rect1  
    116.          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.                  rect1.width * 0.05; height: rect1.height  
    129.             }  
    130.   
    131.             Column  
    132.             {  
    133.                 spacing: rect1.height * 0.025  
    134.   
    135.                 Item  
    136.                 {  
    137.                      rect1.width * 0.8; height: rect1.height * 0.05  
    138.                 }  
    139.   
    140.                 LineInput  
    141.                 {  
    142.                     id: txt_user_id  
    143.                      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.                      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.                          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.                          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.                          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.                          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) << " "   
      330.                     << QString::number(flag_auto_login,16) << " "   
      331.                     << _user_id << " "   
      332.                     << _password << " ";  
      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. }  

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

  • 相关阅读:
    华为笔试
    进程间通信——管道通信
    进程间通信——使用WM_COPYDATA消息通信
    混合高斯背景建模
    基于mean shift的目标跟踪算法
    Lukas-Kanade光流法
    【CUDA并行编程之八】Cuda实现Kmeans算法
    【CUDA并行编程之七】数组元素之和
    【CUDA并行编程之六】KNN算法的并行实现
    【CUDA并行编程之五】计算向量的欧式距离
  • 原文地址:https://www.cnblogs.com/findumars/p/6152815.html
Copyright © 2011-2022 走看看