理论:
QNetworkRequest 类用于表示网络请求,它也充当一个与请求信息相关的通用容器,例如:任何头信息和使用的加密相关的信息。当一个 request 对象被构造时,指定的 URL 决定所用的协议。目前 HTTP、FTP 和本地文件 URLs 支持上传和下载。
QNetworkAccessManager 类用于协调网络操作,一旦创建一个 request,该类用来发出请求并发射信号来报告它的进度。manager 也协调 cookies 的使用在 client 存储数据、请求的身份验证、代理的使用。
QNetworkReply 类用于网络请求的响应,当一个 request 被发出后,QNetworkAccessManager 就会创建相应的响应,通过 QNetworkReply 提供的信号可以单独监听每个响应,或者使用 manager 的信号。由于 QNetworkReply 是 QIODevice 的一个子类,可以同步或异步处理响应;也就是说,阻塞或非阻塞操作。
每个应用程序或库都可以创建一个或多个 QNetworkAccessManager 实例来处理网络通信。
实例:
功能:
获取指定网页的信息。
效果图:
步骤:
步骤一:
在pro文件中,加入QT += network
步骤二:
加入用到的函数头文件。
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
源码:
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void finishedSlot(QNetworkReply*);
private:
QNetworkAccessManager *m_NetManger;
QNetworkReply* m_Reply;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include <QUrl>
#include <QVariant>
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_NetManger = new QNetworkAccessManager;
QUrl url("http://www.suse.edu.cn/");
m_Reply = m_NetManger->get(QNetworkRequest(url));
QObject::connect(m_NetManger, SIGNAL(finished(QNetworkReply*)),
this, SLOT(finishedSlot(QNetworkReply*)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::finishedSlot(QNetworkReply *)
{
m_Reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
m_Reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (m_Reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = m_Reply->readAll();
QString string = QString::fromUtf8(bytes);
qDebug()<<string;
ui->textBrowser->setText(string);
}
else
{
qDebug()<< m_Reply->errorString();
}
m_Reply->deleteLater();
}