Qt: 网络编程实例,QNetworkAccessManager获取网页数据

理论:

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

[cpp] view plain copy
 
  1. #include "mainwindow.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MainWindow w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  

//mainwindow.h

[cpp] view plain copy
 
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QtNetwork/QNetworkAccessManager>  
  6. #include <QtNetwork/QNetworkRequest>  
  7. #include <QtNetwork/QNetworkReply>  
  8.   
  9. namespace Ui {  
  10. class MainWindow;  
  11. }  
  12.   
  13. class MainWindow : public QMainWindow  
  14. {  
  15.     Q_OBJECT  
  16.   
  17. public:  
  18.     explicit MainWindow(QWidget *parent = 0);  
  19.     ~MainWindow();  
  20.   
  21. private slots:  
  22.     void finishedSlot(QNetworkReply*);  
  23.   
  24. private:  
  25.     QNetworkAccessManager *m_NetManger;  
  26.     QNetworkReply* m_Reply;  
  27.   
  28. private:  
  29.     Ui::MainWindow *ui;  
  30. };  
  31.   
  32. #endif // MAINWINDOW_H  


//mainwindow.cpp

 

[cpp] view plain copy
 
    1. #include "mainwindow.h"  
    2. #include <QUrl>  
    3. #include <QVariant>  
    4. #include "ui_mainwindow.h"  
    5.   
    6. MainWindow::MainWindow(QWidget *parent) :  
    7.     QMainWindow(parent),  
    8.     ui(new Ui::MainWindow)  
    9. {  
    10.     ui->setupUi(this);  
    11.     m_NetManger = new QNetworkAccessManager;  
    12.     QUrl url("http://www.suse.edu.cn/");  
    13.   
    14.     m_Reply = m_NetManger->get(QNetworkRequest(url));  
    15.   
    16.     QObject::connect(m_NetManger, SIGNAL(finished(QNetworkReply*)),  
    17.                      this, SLOT(finishedSlot(QNetworkReply*)));  
    18. }  
    19.   
    20. MainWindow::~MainWindow()  
    21. {  
    22.     delete ui;  
    23. }  
    24.   
    25. void MainWindow::finishedSlot(QNetworkReply *)  
    26. {  
    27.     m_Reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);  
    28.     m_Reply->attribute(QNetworkRequest::RedirectionTargetAttribute);  
    29.   
    30.     if (m_Reply->error() == QNetworkReply::NoError)  
    31.     {  
    32.         QByteArray bytes = m_Reply->readAll();  
    33.         QString string = QString::fromUtf8(bytes);  
    34.         qDebug()<<string;  
    35.   
    36.         ui->textBrowser->setText(string);  
    37.     }  
    38.     else  
    39.     {  
    40.         qDebug()<< m_Reply->errorString();  
    41.     }  
    42.   
    43.     m_Reply->deleteLater();  
posted @ 2017-10-19 14:19  苍月代表我  阅读(870)  评论(0编辑  收藏  举报