【QT】HTTP

发布于:2024-07-29 ⋅ 阅读:(124) ⋅ 点赞:(0)

目录

核心API

使用示例:http请求客户端 

第一步:初始化一个QNetworkAccessManager对象实例

第二步: 获取输入框中的url

第三步:构造一个http请求 

第四步:发送请求

第五步: 处理响应

效果如下:

多媒体

播放音频

核心API 

 使用示例:点击按钮播放音频

可能遇到的问题:


         HTTP协议本质上也就是基于TCP协议实现的, 实现一个HTTP客户端/服务器,本质上也就是基于TCP socket进行封装。Qt只是提供了HTTP客户端,而没有提供HTTP服务器的库。

进行Qt开发的时候,和服务器之间的通信很多时候也会用HTTP协议

  • 通过HTTP从服务器获取数据
  • 通过HTTP向服务器提交数据

核心API

关键类主要是三个:QNetworkAccessManager、QNetworkRequest、QNetworkReply

QNetworkAccessManager提供了HTTP 的核心操作

方法 说明
get(const QNetworkRequest& )
发起⼀个 HTTP GET 请求. 返回QNetworkReply 对象.
post(const QNetworkRequest& , const QByteArray& )
发起⼀个 HTTP POST 请求. 返回 QNetworkReply 对象.

QNetworkRequest表示一个HTTP请求(不含body)

/* 如果需要发送一个带有body的请求(比如post),会在QNetworkAccessManager的post方法中通过单独的参数来传入body */

方法 说明
QNetworkRequest(const QUrl& )
通过 URL 构造⼀个 HTTP 请求.
setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)
设置请求头.

QVariant表示一个“类型可变”的值,类似于C语言中的void*

 其中的 QNetworkRequest::KnownHeaders 是⼀个枚举类型, 常⽤取值:

取值 说明
ContentTypeHeader
描述 body 的类型.
ContentLengthHeader
描述 body 的⻓度.
LocationHeader
⽤于重定向报⽂中指定重定向地址. (响应中使⽤, 请求
⽤不到)
CookieHeader
设置 cookie
UserAgentHeader
设置 User-Ag
设置 User-Agent
QNetworkReply 表示⼀个 HTTP 响应. 这个类同时也是 QIODevice 的子类
方法 说明
error()
获取出错状态
errorString()
获取出错原因的⽂本
readAll()
读取响应 body
header(QNetworkRequest::KnownHeaders
header)
读取响应指定 header 的值
此外, QNetworkReply 还有⼀个重要的信号 finished 会在客⼾端收到完整的响应数据之后触
发.

使用示例:http请求客户端 

第一步:初始化一个QNetworkAccessManager对象实例

manager =  new  QNetworkAccessManager(this);

第二步: 获取输入框中的url

QUrl url(ui->lineEdit->text());

第三步:构造一个http请求 

QNetworkRequest request(url);

第四步:发送请求

 QNetworkReply* response = manager->get(request);

第五步: 处理响应

connect(response,&QNetworkReply::finished,this,[=](){

        if(response->error() == QNetworkReply::NoError)

        {

            //响应正确获取到了

            QString html = response->readAll();

            ui->plainTextEdit->setPlainText(html);

        }

        else{

            //响应出错了

            ui->plainTextEdit->setPlainText(response->errorString());

        }

        //还需要对response进行释放

        response->deleteLater();

    });

效果如下:

多媒体

播放音频

        在 Qt 中,⾳频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只⽀持播放 wav 格式的⾳频⽂件。也就是说如果想要添加⾳频效果,那么⾸先需要将 ⾮wav格式 的⾳频⽂件转换为 wav格 式。

        在使用QSound前,需要先引入multimedia模块。

QT += core gui multimedia

核心API 

play()

开始或继续播放当前源

setLoops(int)

设置循环次数
stop() 停止播放

 使用示例:点击按钮播放音频

首先我们先将准备好的.wav音频文件导入qrc中

可能遇到的问题:

点击了按钮,音频并未播放,如下是出问题的代码

void Widget::on_pushButton_clicked()
{
    QSound* sound = new QSound(":/Whales.wav");
    sound->play();

    delete sound;
}

 这里的问题在于音频还没来得及播放,我们就已经释放了sound实例。因此我们需要改进一下写法,将sound挂到对象树上。如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSound>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QSound* sound;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    sound = new QSound(":/Whales.wav",this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    sound->play();

}

qt同样还可以播放视频,这里便不介绍了。


网站公告

今日签到

点亮在社区的每一天
去签到