标签:
Qml如何实现跟web server接口的交互,本文通过一个简单的login操作来模拟
涉及的主要类:
QNetworkAccessManager/QNetworkRequest/QNetworkReply 网络操作
QJsonDocument/QJsonObject JSON数据的封装和解析
1. 定义个用户登录类UserLogin
// UserLogin.H
class UserLogin : public QObject
{
Q_OBJECT
public:
UserLogin(QObject* parent = 0 );
Q_INVOKABLE bool Login(const QString& username , const QString& password) ;
private:
QString _username;
QString _password;
QByteArray __mkLoginRequestData(void);
};
//UserLogin.cpp
UserLogin::UserLogin(QObject *parent)
:QObject(parent)
{
this->_username = this->_password = "";
}
bool UserLogin::Login(const QString &username, const QString &password){
this->_username = username ;
this->_password = password ;
QByteArray dt = this->__mkLoginRequestData();
QByteArray contentsize = QByteArray::number(dt.size());
QUrl url("http://127.0.0.1:3000/login");
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl( url );
//set head
request.setRawHeader("content-type","application/json");
request.setRawHeader("content-length",contentsize );
QNetworkReply* reply = manager->post(request , dt );
if( reply->error() != QNetworkReply::NoError )
{
return true;
}
return false;
}
QByteArray UserLogin::__mkLoginRequestData()
{
QJsonObject obj;
obj.insert("username",this->_username);
obj.insert("password",this->_password);
QJsonDocument doc;
doc.setObject( obj );
return doc.toJson();
}
2. 界面,界面主要通过一个js方法来实现登录
function onLogin() { var username = _usernameText.text.trim(); var password = _passwordText.text.trim(); var result = loginobj.Login(username , Qt.md5(password)); if( result === true ){ console.log("successful") } else { console.log(‘faliure‘); } }
import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Hello World") Rectangle{ id: _mainCOntent anchors.fill: parent color : ‘#eee‘ ColumnLayout{ anchors.centerIn: parent spacing: 5 RowLayout{ id: _userLayout width: 260; height: 30 Label{ anchors.verticalCenter: parent .verticalCenter; text: ‘UserName:‘ } TextField { id:_usernameText anchors.verticalCenter: parent .verticalCenter; width: 200; height: 30 activeFocusOnPress: true placeholderText: "enter your name" } } RowLayout { id:_passwordLayout width: 260; height: 30 ; Label{ anchors.verticalCenter: parent .verticalCenter; text:"Password:" } TextField { id:_passwordText anchors.verticalCenter: parent .verticalCenter; width: 200; height: 30 placeholderText: "enter your password" activeFocusOnPress: true } } SLButton{ text: ‘Login‘ anchors.horizontalCenter: parent.horizontalCenter onClicked: { _mainCOntent.onLogin(); } } } function onLogin() { var username = _usernameText.text.trim(); var password = _passwordText.text.trim(); var result = loginobj.Login(username , Qt.md5(password)); if( result === true ){ console.log("successful") } else { console.log(‘faliure‘); } } } }
slButton是个自定义的按钮等同于QML的button重写了button的样式
3.主文件,main.cpp :主要实现加载QML文件,同时将UserLogin传递给QML,让QML能直接进行访问userLogin类
int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); UserLogin lg; //--> 将UserLogin传递给QML,让QML可以直接访问UserLogin类 engine.rootContext()->setContextProperty("loginobj",&lg); return app.exec(); }
4.服务端代码
var express = require(‘express‘), bodyParser= require(‘body-parser‘); var app = express(); app.use(bodyParser.urlencoded({ extended: false })); // parse application/json app.use(bodyParser.json()); app.post(‘/login‘,function(req,res){ var u = req.body.username; var p = req.body.password; console.log("username:" + u ); console.log(‘password:‘ + p ); }); app.listen(3000,function(){ console.log(‘server is running‘); });
5.程序运行:
1) 服务端: 首先你确保你的电脑安装了Nodejs,新建一个app文件夹同时创建个app.js文件,安装body-parser模块(用于解析application/json,表单请求操作),然后node app.js
2) 客户端: 本文基于Qt5.5实现,新建个QtQuick 工程然后新建相关文件即可了
标签:
原文地址:http://www.cnblogs.com/visonme/p/5027785.html