QML与C++交互:登陆界面设计
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:WIN7
开发环境:Qt5.2.1
说明:
QML设计前台界面,C++后台负责逻辑
效果图:




源代码:
前台qml文件
login.qml
后台C++代码
main.c
-
- #include "world.h"
- #include "main_gui.h"
- #include "login_gui.h"
- #include "light_gui.h"
- #include "heart_beat.h"
- #include "net.h"
- #include "data_sync_center.h"
- #include "set_ctrl_state.h"
-
- int main(int argc, char *argv[])
- {
- QGuiApplication app(argc, argv);
-
-
- qmlRegisterType<Login_Gui>("Login_Gui", 1, 0, "Login_Gui");
-
- QtQuick2ApplicationViewer viewer;
- viewer.setMainQmlFile(QStringLiteral("qml/SH_User/login.qml"));
- viewer.showExpanded();
-
- return app.exec();
- }
login_gui.h
login_gui.c
-
-
- #include "login_gui.h"
-
-
-
- Login_Gui::Login_Gui()
- {
-
- Login_Counter = 0;
-
-
- timer = new QTimer(this);
-
- connect(timer, SIGNAL (timeout()), this , SLOT(slot_tick()));
-
- QFile file_cfg("cfg.txt");
- QByteArray arr;
- bool ok;
- int flag_remember = 0;
- int flag_auto_login = 0;
- int id = 0;
- int password = 0;
- QString str;
- int i = 0;
- int j = 0;
-
-
- _user_id = "";
- _password = "";
- _flag_remember = false;
- _flag_auto = false;
-
-
- if (!file_cfg.exists())
- {
- file_cfg.close();
- }
- else
- {
-
- file_cfg.open(QIODevice::ReadOnly);
-
- do
- {
- str.clear();
- arr = file_cfg.readLine();
- for (i = 0;i < arr.count();i++)
- {
- if ((arr.at(i) >= ‘0‘ && arr.at(i) <= ‘9‘) || \
- (arr.at(i) >= ‘a‘ && arr.at(i) <= ‘f‘) || \
- arr.at(i) == ‘x‘)
- {
- str[j++] = arr.at(i);
- }
- }
- flag_remember = str.toInt(&ok,16);
- if (!ok)
- {
- break;
- }
-
- str.clear();
- arr = file_cfg.readLine();
- for (i = 0;i < arr.count();i++)
- {
- if ((arr.at(i) >= ‘0‘ && arr.at(i) <= ‘9‘) || \
- (arr.at(i) >= ‘a‘ && arr.at(i) <= ‘f‘) || \
- arr.at(i) == ‘x‘)
- {
- str[j++] = arr.at(i);
- }
- }
- flag_auto_login = str.toInt(&ok,16);
- if (!ok)
- {
- break;
- }
-
- str.clear();
- arr = file_cfg.readLine();
- for (i = 0;i < arr.count();i++)
- {
- if ((arr.at(i) >= ‘0‘ && arr.at(i) <= ‘9‘) || \
- (arr.at(i) >= ‘a‘ && arr.at(i) <= ‘f‘) || \
- arr.at(i) == ‘x‘)
- {
- str[j++] = arr.at(i);
- }
- }
- id = str.toInt(&ok,16);
- if (!ok)
- {
- break;
- }
-
- str.clear();
- arr = file_cfg.readLine();
- for (i = 0;i < arr.count();i++)
- {
- if ((arr.at(i) >= ‘0‘ && arr.at(i) <= ‘9‘) || \
- (arr.at(i) >= ‘a‘ && arr.at(i) <= ‘f‘) || \
- arr.at(i) == ‘x‘)
- {
- str[j++] = arr.at(i);
- }
- }
- password = str.toInt(&ok,16);
- if (!ok)
- {
- break;
- }
-
-
- if (flag_remember == VALID_FLAG)
- {
- _user_id = QString::number(id,10);
- _password = QString::number(password,10);
- _flag_remember = true;
-
-
- if (flag_auto_login == VALID_FLAG)
- {
- _flag_auto = true;
- slot_login_req();
- }
- }
- } while (0);
-
- file_cfg.close();
- }
- }
-
-
- Login_Gui::~Login_Gui()
- {
- }
-
-
- QString Login_Gui::user_id()
- {
- return _user_id;
- }
-
-
- void Login_Gui::set_user_id(QString str)
- {
- if (_user_id != str)
- {
- _user_id = str;
- emit sig_user_id_changed();
- }
- }
-
-
- QString Login_Gui::password()
- {
- return _password;
- }
-
-
- void Login_Gui::set_password(QString str)
- {
- if (_password != str)
- {
- _password = str;
- emit sig_password_changed();
- }
- }
-
-
- bool Login_Gui::flag_remember()
- {
- return _flag_remember;
- }
-
-
- void Login_Gui::set_flag_remember(bool flag)
- {
- if (_flag_remember != flag)
- {
- _flag_remember = flag;
- emit sig_flag_remember_changed();
- }
- }
-
-
- bool Login_Gui::flag_auto()
- {
- return _flag_auto;
- }
-
-
- void Login_Gui::set_flag_auto(bool flag)
- {
- if (_flag_auto != flag)
- {
- _flag_auto = flag;
- emit sig_flag_auto_changed();
- }
- }
-
-
- void Login_Gui::slot_login_req()
- {
-
- Login_Counter = 0;
-
- timer->start(INTERVAL_LOGIN);
- slot_tick();
- }
-
-
- void Login_Gui::slot_login_ack(QByteArray data)
- {
- uint32_t id = 0;
- uint32_t password = 0;
- int flag_remember = 0;
- int flag_auto_login = 0;
- uint8_t result = 0;
- bool ok;
-
- #ifdef DEBUG
- qDebug() << "接收帧:尝试登陆" << (uint8_t)data[0] << (uint8_t)data[1] << (uint8_t)data[2];
- #endif
-
-
- Login_Counter = 0;
-
- timer->stop();
-
-
- id = ((uint8_t)data[6] << 24) +\
- ((uint8_t)data[7] << 16) + \
- ((uint8_t)data[8] << 8) + \
- (uint8_t)data[9];
- password = ((uint8_t)data[10] << 24) +\
- ((uint8_t)data[11] << 16) + \
- ((uint8_t)data[12] << 8) + \
- (uint8_t)data[13];
-
- result = (uint8_t)data[LEN_FRAME_HEAD];
-
- switch (result)
- {
-
- case 0:
- {
-
- if (id == (uint32_t)_user_id.toInt(&ok) && password == (uint32_t)_password.toInt(&ok))
- {
-
- emit sig_login_result(0);
-
- #ifdef DEBUG
- qDebug() << "登陆成功" << "用户号" << _user_id << "密码" << _password;
- #endif
-
-
- if (_flag_remember)
- {
- flag_remember = VALID_FLAG;
- }
- if (_flag_auto)
- {
- flag_auto_login = VALID_FLAG;
- }
-
-
- QFile file_cfg("cfg.txt");
- file_cfg.open(QIODevice::WriteOnly);
- QTextStream out(&file_cfg);
- out << QString::number(flag_remember,16) << "\r\n" \
- << QString::number(flag_auto_login,16) << "\r\n" \
- << _user_id << "\r\n" \
- << _password << "\r\n";
- file_cfg.close();
- }
-
- break;
- }
-
- case 1:
- {
- #ifdef DEBUG
- qDebug() << "登陆失败" << "用户号不存在";
- #endif
-
-
- emit sig_login_result(1);
-
- break;
- }
-
- case 2:
- {
- #ifdef DEBUG
- qDebug() << "登陆失败" << "密码错误";
- #endif
-
-
- emit sig_login_result(2);
-
- break;
- }
- }
- }
-
-
- void Login_Gui::slot_tick()
- {
- QByteArray frame;
- bool ok;
-
-
- Login_Counter++;
- if (Login_Counter > NUM_LOGIN)
- {
- #ifdef DEBUG
- qDebug() << "登录失败" << "达到最大尝试登陆次数:" << NUM_LOGIN;
- #endif
-
-
- Login_Counter = 0;
-
-
- timer->stop();
-
- emit sig_login_result(3);
-
- return;
- }
-
-
-
- frame.clear();
-
- #ifdef DEBUG
- qDebug() << "发送帧:发送登陆请求";
- #endif
- emit sig_net_tx_frame_with_id((uint32_t)_user_id.toInt(&ok),(uint32_t)_password.toInt(&ok),\
- CMD_USER_LOGIN_REQUEST,0,frame);
- }
http://blog.csdn.net/jdh99/article/details/25774797
QML与C++交互:登陆界面设计
原文:http://www.cnblogs.com/findumars/p/6152815.html