做一个qt网络请求

Posted

技术标签:

【中文标题】做一个qt网络请求【英文标题】:Doing a qt network request 【发布时间】:2014-09-27 16:54:04 【问题描述】:

我试图连接到一个网站并使用 qt 执行请求,到目前为止我得到了这段代码,但它告诉我以下错误:

#include <QCoreApplication>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>

void sendRequest();

int main(int argc, char *argv[])  
    QCoreApplication a(argc, argv);
    sendRequest();
    return a.exec();


void sendRequest()     
QNetworkAccessManager *manager = new QNetworkAccessManager(this);   connect(manager, SIGNAL(finished(QNetworkReply*)),      this, SLOT(replyFinished(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

上面写着:

错误 1 ​​错误 C2355: 'this' : 只能在非静态内部引用 成员函数或非静态数据成员 初始化程序 c:\Users\Synturas\documents\visual studio 2013\Projects\qt_request\qt_request\main.cpp 19 1 qt_request

错误 2 错误 C2355: 'this' : 只能在非静态内部引用 成员函数或非静态数据成员 初始化程序 c:\Users\Synturas\documents\visual studio 2013\Projects\qt_request\qt_request\main.cpp 21 1 qt_request

错误 3 错误 C3861: 'connect': identifier not 找到 c:\Users\Synturas\documents\visual studio 2013\项目\qt_request\qt_request\main.cpp 20 1 qt_request 4 IntelliSense:“this”只能在非静态成员内部使用 函数 c:\Users\Synturas\Documents\Visual Studio 2013\Projects\qt_request\qt_request\main.cpp 19 61 qt_request

5 IntelliSense:标识符“connect”是 未定义 c:\Users\Synturas\Documents\Visual Studio 2013\Projects\qt_request\qt_request\main.cpp 20 2 qt_request

6 IntelliSense:“this”只能在非静态成员内部使用 函数 c:\Users\Synturas\Documents\Visual Studio 2013\Projects\qt_request\qt_request\main.cpp 21 3 qt_request

(我在这个项目中使用 VS2013,如果这是相关的)

【问题讨论】:

【参考方案1】:

试试这个例子:

说明:你创建了一个新类,它将为你完成所有工作,在 main.cpp 中创建这个类的实例并调用方法。

*.h

#ifndef NET_H
#define NET_H

#include <QObject>

#include <QtCore>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class Net : public QObject

Q_OBJECT
  QNetworkAccessManager *manager;
private slots:
  void replyFinished(QNetworkReply *);//slot, we want catch responce
public:
  void CheckSite(QString url);//our method
;



#endif // NET_H

*.cpp

#include "net.h"

void Net::replyFinished(QNetworkReply *reply) //this slot called when we have responce
 
qDebug() << reply->readAll(); //we read result and print it(also you can save it in some variable and use in code


void Net::CheckSite(QString url) 

  QUrl qrl(url);//QUrl has network adress
  manager = new QNetworkAccessManager(this);//create manager
  connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//do connection with nededed signal and slot which we alredy wrote
  manager->get(QNetworkRequest(qrl));//send get request

主要

#include "net.h"


int main(int argc, char *argv[])

    QApplication a(argc, argv);

    Net handler;//create instance
    handler.CheckSite("http://qt-project.org");//set path and wait for responce

    return a.exec();

结果:Qt 站点的 html 代码

【讨论】:

@Synturas 我们可以在这里做,这个消息的结果可以在网络上看到,每个想要学习新东西的人都可以阅读它。请看我的编辑,我为每一行添加了解释并写了 cmets。 很好的解释,明白了一切!但为什么它没有按我的方式工作? @Synturas 主要错误在QNetworkAccessManager(this),您尝试在主cpp中将父级设置为QNetworkAccessManager,只有QObject子类才能成为另一个类的父级。第二:你尝试做connect,但是connect是QObject的静态方法,所以它至少应该是QObject::connect,但是你的代码不能做某事,因为你没有提供可以捕获信息并打印它的槽(我的回答中的replyFinished 插槽执行此操作)

以上是关于做一个qt网络请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 绑定到特定接口/IP 中发出网络请求?

QT实现CSDN上传资源管理助手Demo之请求网络图片SVG并显示

Qt设置阻塞式网络请求,和超时处理

我的QT Creator学习笔记(三十四)——网络编程之HTTP与FTP

我的QT Creator学习笔记(三十四)——网络编程之HTTP与FTP

第九课Qt之高级网络操作(HTTP/FTP快速上手)