在带有QNetworkAccessManager派生类的构造函数中的未定义引用

时间:2014-12-25 23:09:03

标签: c++ qt qtcore qtnetwork moc

我正在尝试使用以下使用Qt库的代码

来阅读html页面
 #include <QtWidgets/QApplication>
    #include <QtNetwork/QNetworkRequest>
    #include <QtNetwork/QNetworkReply>
    #include <QtNetwork/QNetworkAccessManager>
    #include <QtCore/QString>
    #include <iostream>

    class SillyRequest : public QNetworkAccessManager

{
    Q_OBJECT
    public:
        SillyRequest();
        QString getData();
    public slots:
        void replyFinished(QNetworkReply *);
    private:
       QString collectedData;
};
QString SillyRequest :: getData()
{
    return collectedData;
}
SillyRequest :: SillyRequest()
{
    connect(this, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}

void SillyRequest :: replyFinished(QNetworkReply *reply) 
{
    collectedData = reply->readAll();
}

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    SillyRequest *network = new SillyRequest;

    QNetworkRequest request;

    request.setUrl(QUrl("http://qt.nokia.com"));

    request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

    QNetworkReply *reply = network->get(request);

    std :: cout << network->getData().toStdString() << std :: endl;

    return app.exec();

}

编译时出现以下错误。我不确定我没有以正确的方式做什么。

testing.cpp:(.text+0x73): undefined reference to `vtable for SillyRequest'
collect2: error: ld returned 1 exit status
Makefile:192: recipe for target 'network' failed
make: *** [network] Error 1

我继承了QNetworkAccessManager,以实现'replyFinished'插槽。信号'已完成'已经是'QNetworkAccessManager'的一部分。

2 个答案:

答案 0 :(得分:4)

您的短代码存在很多问题,但我会将重点放在其中最重要的部分。

包含moc文件

一般的做法是:

void SillyRequest :: replyFinished(QNetworkReply *reply) 
{
    collectedData = reply->readAll();
}

#include "main.moc" // This is the addition

int main(int argc, char **argv)

问题是你的类不在单独的头文件和源文件中,因此qmake和moc无法知道这一点。

作为旁注,您还可以在此特殊情况下内联所有方法。

单独的标题和来源

如果您不想显式包含动态生成的moc(元对象编译器)文件,则需要为您自己的类建立一个单独的标题(最好是源代码),然后您可以在main.cpp文件。然后,您将在main.cpp

的开头执行此操作
#include "sillyrequest.h"

当然,您可以按如下方式扩展qmake项目文件:

HEADERS = sillyrequest.h
SOURCES = sillyrequest.cpp main.cpp

答案 1 :(得分:0)

如果您使用的是QtCreator,请尝试在testing.cpp底部添加此行

#include "testing.moc"