标签:
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