目录
第一步:初始化一个QNetworkAccessManager对象实例
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
|
方法 | 说明 |
---|---|
error() |
获取出错状态
|
errorString()
|
获取出错原因的⽂本
|
readAll()
|
读取响应 body
|
header(QNetworkRequest::KnownHeaders
header)
|
读取响应指定 header 的值
|
使用示例: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同样还可以播放视频,这里便不介绍了。