首页 > 代码库 > QML与C++交互:登陆界面设计

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

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

 

 

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

 

环境:

主机:WIN7

开发环境:Qt5.2.1

 

说明:

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

 

效果图:

技术分享技术分享

技术分享技术分享

 

源代码:

 

前台qml文件

login.qml

 

[javascript] view plain copy
 
 技术分享技术分享
  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
 
 技术分享技术分享
  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
 
 技术分享技术分享
  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
 
 技术分享技术分享
    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. }  

 

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

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