【问题标题】:Doing a qt network request做一个qt网络请求
【发布时间】: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,如果这是相关的)

【问题讨论】:

    标签: c++ qt networking


    【解决方案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 插槽执行此操作)
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多