Qt Quick 网络请求

方式一:在QML中进行

Button{
    text:"发送请求"
    onClicked: {
        let xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            //XMLHttpRequest.DONE为状态枚举值4
            if(xhr.readyState === 4) {
                print('request DONE',xhr.status);
                if(xhr.status === 200){
                    txt.text = xhr.responseText.toString();
                }
            }
        }
        //【get】
        xhr.open("GET", "http://127.0.0.1:3333/get?q=m");
        xhr.send();
        //【post】
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.open("POST", "http://127.0.0.1:3333/post");
        xhr.send("q=m");
    }
}
qml

上面的方法存在局限性,对本地openssl版本有要求

发送请求失败时,可以考虑以下方法尝试解决:

首先在main函数里面输出当前需要的openssl版本:

qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();
c++

然后去下载openssl对应版本:【openssl下载地址

根据自己使用的QT编译器时32位还是64位,对应下载安装包。

将下载的安装包进行安装,安装到第二个选项时,选择安装到指定的/bin目录下

安装之后,找到安装目录下的/bin目录下的两个文件(libcrypto-1_1.dll 和libssl-1_1.dll),拷贝到QT编译器安装目录下即可(C:\Qt\Qt5.12.12\5.12.12\msvs2017\bin),或者拷贝到当前项目构建的build目录下的debug的目录下面

方式二:通过C++程序发起请求

  • 新建HttpUtils.h
#ifndef HTTPUTILS_H
#define HTTPUTILS_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class HttpUtils : public QObject
{
    Q_OBJECT
public:
    explicit HttpUtils(QObject *parent = nullptr);
    ~HttpUtils();

    Q_INVOKABLE void connect(QString url);
    Q_INVOKABLE void replyFinished(QNetworkReply* reply);

signals:
 void replySignal(QString reply);

private:
    QNetworkAccessManager *manager;

};

#endif // HTTPUTILS_H

c++
  • 新建HttpUtils.cpp
#include "httputils.h"
#include <QDebug>
#include <QNetworkReply>

HttpUtils::HttpUtils(QObject *parent) : QObject(parent)
{
    manager = new QNetworkAccessManager(this);
    QObject::connect(manager, SIGNAL(finished(QNetworkReply* )),this, SLOT(replyFinished(QNetworkReply* )));

}

void  HttpUtils::connect(QString url){
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    manager->get(request);
}
void HttpUtils::replyFinished(QNetworkReply* reply){

    QString result =reply->readAll();
    emit replySignal(result);
}

HttpUtils::~HttpUtils(){
    if(manager!=NULL){
        manager->destroyed();
    }
}
c++
  • 在main函数中注册
#include "httputils.h"

int main(int argc, char *argv[])
{
    //参数:qmlRegisterType<C++类型名> (命名空间 主版本 次版本 QML中的类型名)
    qmlRegisterType<HttpUtils>("MyUtils",1,0,"HttpUtils");
}
c++
  • 在qml中使用

//引入命名空间 版本
import MyUtils 1.0

ApplicationWindow {

  //注册组件
  HttpUtils{
      id:http
  }

  Button{
    text:"发送请求"
    onClicked: {
      //信号处理函数
      function onSearchReply(reply){
         //断开连接
         http.onReplySignal.disconnect(onSearchReply)
         //处理数据
         var data = JSON.parse(reply)
         ...
      }
      //连接信号
      http.onReplySignal.connect(onSearchReply)
      //发送请求
      http.connect("http://127.0.0.1:3333/get?q=m")
    }
  } 

}
qml
打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: