环境:

主机:WIN7

开发环境:Qt5.2.1

说明:

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

效果图:

源代码:


前台qml文件

login.qml

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

后台C++代码

main.c

[cpp] view plaincopy
  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. #include "world.h"
  16. #include "main_gui.h"
  17. #include "login_gui.h"
  18. #include "light_gui.h"
  19. #include "heart_beat.h"
  20. #include "net.h"
  21. #include "data_sync_center.h"
  22. #include "set_ctrl_state.h"
  23. int main(int argc, char *argv[])
  24. {
  25. QGuiApplication app(argc, argv);
  26. //注册组件到QML
  27. qmlRegisterType<Login_Gui>("Login_Gui", 1, 0, "Login_Gui");
  28. QtQuick2ApplicationViewer viewer;
  29. viewer.setMainQmlFile(QStringLiteral("qml/SH_User/login.qml"));
  30. viewer.showExpanded();
  31. return app.exec();
  32. }

login_gui.h

[cpp] view plaincopy
  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. #ifndef LOGIN_GUI_H
  14. #define LOGIN_GUI_H
  15. /*********************************************************************
  16. *                               头文件
  17. **********************************************************************/
  18. #include "world.h"
  19. /*********************************************************************
  20. *                               宏定义
  21. **********************************************************************/
  22. /*********************************************************************
  23. *                               登录间隔
  24. *单位:ms
  25. **********************************************************************/
  26. #define INTERVAL_LOGIN          500
  27. /*********************************************************************
  28. *                               最大登录次数
  29. **********************************************************************/
  30. #define NUM_LOGIN               5
  31. /*********************************************************************
  32. *                               数据结构
  33. **********************************************************************/
  34. /*********************************************************************
  35. *                               登录界面类
  36. **********************************************************************/
  37. class Login_Gui : public QObject
  38. {
  39. Q_OBJECT
  40. //属性:用户名
  41. Q_PROPERTY(QString user_id READ user_id WRITE set_user_id NOTIFY sig_user_id_changed)
  42. //属性:密码
  43. Q_PROPERTY(QString password READ password WRITE set_password NOTIFY sig_password_changed)
  44. //属性:记住密码标志
  45. Q_PROPERTY(bool flag_remember READ flag_remember \
  46. WRITE set_flag_remember NOTIFY sig_flag_remember_changed)
  47. //属性:自动登录标志
  48. Q_PROPERTY(bool flag_auto READ flag_auto \
  49. WRITE set_flag_auto NOTIFY sig_flag_auto_changed)
  50. public:
  51. /*********************************************************************
  52. *                           函数
  53. **********************************************************************/
  54. /*********************************************************************
  55. *                           初始化函数
  56. **********************************************************************/
  57. Login_Gui();
  58. /*********************************************************************
  59. *                           解构函数
  60. **********************************************************************/
  61. ~Login_Gui();
  62. /*********************************************************************
  63. *                           属性读取:用户号
  64. **********************************************************************/
  65. QString user_id();
  66. /*********************************************************************
  67. *                           属性写入:用户号
  68. **********************************************************************/
  69. void set_user_id(QString str);
  70. /*********************************************************************
  71. *                           属性读取:密码
  72. **********************************************************************/
  73. QString password();
  74. /*********************************************************************
  75. *                           属性写入:密码
  76. **********************************************************************/
  77. void set_password(QString str);
  78. /*********************************************************************
  79. *                           属性读取:记住密码标志
  80. **********************************************************************/
  81. bool flag_remember();
  82. /*********************************************************************
  83. *                           属性写入:记住密码标志
  84. **********************************************************************/
  85. void set_flag_remember(bool flag);
  86. /*********************************************************************
  87. *                           属性读取:自动登陆标志
  88. **********************************************************************/
  89. bool flag_auto();
  90. /*********************************************************************
  91. *                           属性写入:自动登陆标志
  92. **********************************************************************/
  93. void set_flag_auto(bool flag);
  94. signals:
  95. /*********************************************************************
  96. *                           属性改变信号:用户号
  97. **********************************************************************/
  98. void sig_user_id_changed();
  99. /*********************************************************************
  100. *                           属性改变信号:密码
  101. **********************************************************************/
  102. void sig_password_changed();
  103. /*********************************************************************
  104. *                           属性改变信号:记住密码标志
  105. **********************************************************************/
  106. void sig_flag_remember_changed();
  107. /*********************************************************************
  108. *                           属性改变信号:自动登陆标志
  109. **********************************************************************/
  110. void sig_flag_auto_changed();
  111. /*********************************************************************
  112. *                           信号:登陆结果
  113. *参数:result:0:成功
  114. *           1:无此用户名
  115. *           2:密码错误
  116. *           3:达到登陆的最大次数
  117. **********************************************************************/
  118. void sig_login_result(int result);
  119. /*********************************************************************
  120. *                               发送网络帧
  121. *参数:id:用户名
  122. *    password:密码
  123. *    cmd:帧命令
  124. *    index:发送序列号
  125. *    frame:发送的报文
  126. **********************************************************************/
  127. void sig_net_tx_frame_with_id(uint32_t id,uint32_t password,int cmd,uint16_t index,QByteArray frame);
  128. public slots:
  129. /*********************************************************************
  130. *                           槽函数:登陆请求
  131. **********************************************************************/
  132. void slot_login_req();
  133. /*********************************************************************
  134. *                           槽函数:登陆响应
  135. *参数:data:接收的数据
  136. **********************************************************************/
  137. void slot_login_ack(QByteArray data);
  138. private slots:
  139. /*********************************************************************
  140. *                           槽函数:心跳滴答函数
  141. *说明:1滴答触发1次
  142. **********************************************************************/
  143. void slot_tick();
  144. private:
  145. /*********************************************************************
  146. *                           变量
  147. **********************************************************************/
  148. /*********************************************************************
  149. *                           属性:用户号
  150. **********************************************************************/
  151. QString _user_id;
  152. /*********************************************************************
  153. *                           属性:密码
  154. **********************************************************************/
  155. QString _password;
  156. /*********************************************************************
  157. *                           属性:记住密码标志
  158. **********************************************************************/
  159. bool _flag_remember;
  160. /*********************************************************************
  161. *                           属性:自动登录标志
  162. **********************************************************************/
  163. bool _flag_auto;
  164. /*********************************************************************
  165. *                           滴答定时器
  166. **********************************************************************/
  167. QTimer *timer;
  168. /*********************************************************************
  169. *                           登录计数器
  170. **********************************************************************/
  171. int Login_Counter;
  172. };
  173. #endif // LOGIN_GUI_H

login_gui.c

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

QML与C++交互:登陆界面设计相关推荐

  1. Android学习之登陆界面设计(一)前后期准备以及相关配置

    Android学习之登陆界面设计(一)前后期准备以及相关配置 前言 成品 成品样式 成品特点 工具 系统配置 手机配置 Android Studio 3.6.3 SDK 图片来源 矢量图标库 Back ...

  2. Android学习之登陆界面设计(二)基本界面设计

    Android学习之登陆界面设计(二)基本界面设计 前提 绘图样式 - drawable bg_login_btn_submit.xml bg_login_panel_slide.xml bg_log ...

  3. 说说抖音和小红书的交互和界面设计,您更喜欢哪一个?

    2021-6-25     蓝蓝  随笔的一些文章 作者:蓝蓝设计的蓝蓝 HI,亲爱的宝宝们(视频App上常用的呢称 ),大家好,小红书和抖音是最近非常火爆的两个视频类的APP,可以说是视频APP中的 ...

  4. 迅速提高产品用户体验、交互、界面设计的几个绝妙方法

    我们的产品为什么会吸引人?为什么便于推广?为什么能保持活跃度?除了内容和功能满足了用户需求以外,很重要的原因是产品在设计层面符合了大众的口味.有人可能觉得是在谈时尚范畴的东西,这只是一方面,更多的在于 ...

  5. android布局基础及范例:QQ登陆界面设计

    使用android手机的用户想必都有android手机QQ客户端吧,我们是不是觉得QQ登陆界面非常漂亮美观而且具有亲和力?我们是不是也想作出像 QQ那样美观的界面?有的人肯定会问,做UI那不是美工人员 ...

  6. WDA演练一:用户登陆界面设计(一)

    一,新建用户表: 用户和密码参考标准的.这里给用户分了几个维度,以便后面进行接下来的业务设定. 二,新建ZLY_PORTAL 程序. 除了MAIN视图外,在添加LOGON视图. 1.导入预先做好的主页 ...

  7. 人工智能交互系统界面设计(Tkinter界面设计)

    文章目录 前言 一.项目介绍 二.项目准备 三.项目实施 1.导入相关库文件 2.人脸信息验证功能 3.语音交互与TCP数据通信 4.数据信息可视化 四.相关附件 前言 在现代信息化时代,图形化用户界 ...

  8. 应用篇1.3 后台登陆界面设计

    应用篇1.3 后台登陆界面审计 一.后台登陆界面图: 各种准备工作完毕后,对于这款日程管理类的软件,首先设计一个后台登陆功能.可以通过密码保护自己的日程隐私. 1.初次登陆界面如图1.1所示. 2.如 ...

  9. 动态交互app界面设计原理指南

    动态交互对数字产品的用户体验产生了深远的影响,但是,如果界面元素没有表现出基本的动态交互设计原理,则可用性会受到损害.在用户界面的上下文中,动作不仅仅是视觉装饰.它是一种强大的力量,可增强产品参与度并 ...

最新文章

  1. 毕业论文中使用的技术—FileReader接口
  2. 逻辑备库的Swichover和Failover
  3. random()模块随机函数的用法总结
  4. EL表达式和JSTL标准标签库
  5. MySQL--3--mysqldump备份策略
  6. sharepoint ECMAScript对象模型系列
  7. shell生成随机数+判断路径存不存在+判断文件夹有无内容
  8. Mac 如何保护您的数据安全?
  9. android 广告字幕,Android编程实现类似天气预报图文字幕垂直滚动效果的方法
  10. JS:读取excel并显示
  11. MyBatis拦截器执行顺序
  12. 晶振负载电容计算公式和说明
  13. SWUN 1423 - 伊邪那美
  14. 你是否同意放开二胎政策
  15. UVA 10306 e-Coins(二维完全背包)
  16. Excel插入图片实现单击放大或缩小
  17. 如何找回mysql密码
  18. 输入分钟输出小时python_python格式化输出时间
  19. windows系统巨型帧问题
  20. Labview从入门到会用(一)——创建数据文件

热门文章

  1. 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库解码 WebP 图片 )
  2. 在一个千万级的数据库查寻中,如何提高查询效率?
  3. JavaWeb总结(九)
  4. 3164 质因数分解
  5. 1.嵌入式系统的简介
  6. Android LayoutInflater详解(转)
  7. Maven实战系列文章目录
  8. typedef 用法总结
  9. 基于Case的MIS系统 - 总账模块
  10. 用select 语句中的START WITH...CONNECT BY PRIOR子句实现递归查询