【问题标题】:slot error using QNetworkAccessManager使用 QNetworkAccessManager 的插槽错误
【发布时间】:2014-06-11 17:14:43
【问题描述】:

我正在尝试在 Qt 中实现基本的 http 连接 http://developer.nokia.com/community/wiki/Creating_an_HTTP_network_request_in_Qt,但我很难实现插槽。我是 Qt 新手。

C:\Qt5\Tools\QtCreator\bin\miniHTTP\main.cpp:10: 错误:在“mTest”中请求成员“Test”,它属于非类类型“coreEng()” mTest.Test();

//main.cpp

#include <QCoreApplication>
#include <coreeng.h>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    coreEng mTest;
    mTest.Test();
    return a.exec();
}

//coreeng.h

#ifndef COREENG_H
#define COREENG_H
#include <QDebug>
#include <QObject>
#include <QNetworkAccessManager>

class coreEng : public QObject
{
    Q_OBJECT
public:
    explicit coreEng(QObject *parent = 0);
    void Test();
private slots:

public slots:
    void connect();
    void url();
    void finishedSlot();


private:
    QNetworkAccessManager* nam;

};

#endif // COREENG_H

//coreeng.cpp

#include "coreeng.h"
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QImageReader>

coreEng::coreEng(QNetworkReply* parent) :
    QObject(parent)

{
}

void coreEng::Test();

void coreEng::connect(){
    QObject::connect(nam, SIGNAL(finished(QNetworkReply*)),
    this, SLOT(finishedSlot(QNetworkReply*)));
}

void coreEng::url(){
    QUrl url("http://www.forum.nokia.wiki");
    QNetworkReply* reply = nam->get(QNetworkRequest(url));
}


void coreEng::finishedSlot(QNetworkReply* reply){

    QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

    QVariant redirectionTargetUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);

    if (reply->error() == QNetworkReply::NoError)
    {

        QImageReader imageReader(reply);
        QImage pic = imageReader.read();

        QByteArray bytes = reply->readAll();  // bytes
        QString string(bytes); // string
    }

    else
    {

    }

    delete reply;

}

【问题讨论】:

  • en.wikipedia.org/wiki/Most_vexing_parsecoreEng mTest(); 更改为 coreEng mTest;
  • @drescherjm 谢谢。这似乎让我走得更远了,但我仍然在初始化对象时遇到问题-> coreeng.cpp:8:错误:'coreEng::coreEng(QNetworkReply*)' 的原型与'coreEng'类中的任何内容都不匹配

标签: c++ qt qnetworkaccessmanager


【解决方案1】:

您已在头文件中将void Test(); 声明为成员函数,但尚未在cpp 文件中实现它。你应该实现它:

void coreEng::Test()
{
    ...
}

【讨论】:

  • 非常感谢。我以前试过,我得到了同样的错误。
【解决方案2】:

除了已经描述的其他问题之外,您的完成插槽的实现与函数定义的签名不同。在您的 .h 文件中,您有:

void finishedSlot();

而您的 .cpp 有:

void finishedSlot(QNetworkReply *reply) {
    /*code here*/
}

总结一下:

  1. 添加测试功能的实现:

    void coreEng::Test() { /代码在这里/ }

  2. 修复构造函数的签名,使 .cpp 和 .h 文件一致:

    coreEng::coreEng(QObject* parent) : QObject(parent) { /代码在这里/ }

  3. 修复finishedSlot的签名,使.cpp和.h文件一致:

    void finishedSlot(QNetworkReply *reply);

这些更改至少会让您进入成功编译的阶段。

【讨论】:

    【解决方案3】:

    一个问题是你遇到了最棘手的解析:http://en.wikipedia.org/wiki/Most_vexing_parse

    Most vexing parse

    改变

    coreEng mTest();
    

    coreEng mTest;
    

    第二个问题是你在 coreeng.cpp 中的构造函数有错误的签名

    变化:

    coreEng::coreEng(QNetworkReply*) :
        QObject(parent)
    

       coreEng::coreEng(QObject* parent) :
            QObject(parent)
    

    【讨论】:

    • 另外我建议在我们帮助解决问题时不要更改原始问题代码,因为我的答案的第一部分不再有意义。
    • 我很抱歉,我实际上认为它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多