zoukankan      html  css  js  c++  java
  • Qt5 http协议 获取网页数据

    一、HTTP协议

        Qt网络模块提供的API可以实现基于HTTP(Hyper Text Transport Protocol)协议的应用程序。此外, Qt还可以实现多种基于

      协议的应用程序, 如位于OSI 7层应用层的FTP、DNS、SNMP。

        Qt4.x版本提供了QHttp和QFtp类以支持HTTP和FTP协议。从Qt 5.0 版本开始, 删除了QHttp 和 QFtp 类, 通过QNetworkReply

      、QNetworkAccessManager、QNetworkRequest类实现基于HTTP和FTP协议的应用程序。除了HTTP和FTP协议外, 该类还可以实

      现高层(OSI 7层中的上层)网络应用程序。

        ① QNetworkRequest类, 通过网络请求是使用。而且, 可以请求包含头信息和加密(encryption)的头信息。 QNetworkRequest可

      以通过URL上传和下载HTTP、FTP的本地文件。

        ② QNetworkAccessManager  类用于管理网络请求和响应, 可以在网络上管理请求 和 响应的设置, 使用代理和缓存,

      处理网络请求和响应过程中触发的信号。

        ③ QNetworkReply类用于在网络上处理响应, 它是QIODevice的子类, 支持同步异步的方式。

    二、代码示例

      下面是一个获取百度天气的代码:

      ① 环境为vs2013 + qt5.7

      ② 创建Qt5 Gui QApplication工程

      ③ 在ui中添加textBrowser, 用于展示获取到的数据

        

      ④ 源码展示

      

    /*头文件*/
    #ifndef NETWORKWIDGET_H
    #define NETWORKWIDGET_H
    
    #include <QtNetwork/QNetworkAccessManager>
    #include <QtNetwork/QNetworkRequest>
    #include <QtNetwork/QNetworkReply>
    #include <QtWidgets/QWidget>
    #include <QTextCodec>
    #include <QString>
    #include <QUrl>
    #include "ui_networkWidget.h"
    
    class networkWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        networkWidget(QWidget *parent = 0);
        ~networkWidget();
    
    private Q_SLOTS:
        void slot_replayFinished(QNetworkReply *reply);
    
    private:
        Ui::networkWidgetClass ui;
    
        QNetworkAccessManager *m_manager;
        //QNetworkReply *m_replay;
    };
    
    #endif // NETWORKWIDGET_H
    /*实现文件*/
    #include "networkWidget.h"
    
    networkWidget::networkWidget(QWidget *parent)
        : QWidget(parent)
    {
        ui.setupUi(this);
        this->setWindowFlags(Qt::FramelessWindowHint);
        m_manager = new QNetworkAccessManager(this);//新建QNetworkAccessManager对象
        connect(m_manager, SIGNAL(finished(QNetworkReply    *)), this, SLOT(slot_replayFinished(QNetworkReply*))); //关联信号和槽 
        m_manager->get(QNetworkRequest(QUrl("http://apistore.baidu.com/microservice/weather?cityid=成都")));//发送请求
    }
    
    networkWidget::~networkWidget()
    {
        
    }
    
    void networkWidget::slot_replayFinished(QNetworkReply *reply)
    {
        QTextCodec *codec = QTextCodec::codecForName("utf8");
            //使用utf8编码, 这样可以显示中文
        QString str = codec->toUnicode(reply->readAll());
        ui.textBrowser->setText(str);
        reply->deleteLater();//最后要释放replay对象
    }
    #include "networkWidget.h"
    #include <QtWidgets/QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        networkWidget w;
        w.show();
        return a.exec();
    }

     三、运行程序崩溃

        编译能够通过, 运行程序崩溃,崩溃在发送请求第十行,  最初以为是内存泄漏才造成的堆区损坏, 查看官方文档用法发现我们的代码

      根本没有错, 最后用Qt Creator创建工程测试发现我们的代码完全没有问题, 获取数据成功。 最后确定肯定是vs配置中没有Qt5的依赖

      库。下面是错误截图:

        

      解决办法: 右击工程-> 配置属性 -> 链接器 -> 输入 -> 附加依赖项, 发现依赖可以种包含的lib都是带d, 而我现在用的是debug模式, 所以我

           加入Qt5Core.lib、Qt5Gui.lib, 最后运行不在崩溃, 成功获取数据。

           Qt中的所有lib库都位于Qt的安装路径lib文件下, 如:C:QtQt5.7.05.7msvc2013_64lib

        注: 带d的库是用于debug模式, 不带d的是用于Release模式

        

    四、结果展示

        

      

     

      

     

     

      

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/jiangson/p/6016369.html
Copyright © 2011-2022 走看看