【问题标题】:Undefined reference to in Constructor with QNetworkAccessManager derived class带有 QNetworkAccessManager 派生类的构造函数中未定义的引用
【发布时间】:2014-12-25 23:09:02
【问题描述】:

我正在尝试使用以下使用 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”的一部分。

【问题讨论】:

  • SillyRequest 有虚方法吗?
  • 在构造函数里面,试试connect (..., SLOT(SillyRequest::replyFinished(QNetworkReply*))

标签: c++ qt qtcore qtnetwork moc


【解决方案1】:

您的短代码存在很多问题,但我将在下面重点介绍其中最核心的部分。

包含 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

【讨论】:

  • 为什么在这种特殊情况下建议使用内联方法?
  • @Aslaville: 1) 这些是可内联的短方法,因此编译器更明确地对其进行优化,从而可能使其速度稍快一些。 2) 代码也会变得更短。
  • @Aslaville:因为你有 13 个问题没有被接受,please read this 如果你还没有这样做;不一定要接受这个答案,但看看你的记录,似乎你有几个很好的答案应该可以解决你的问题。
【解决方案2】:

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

#include "testing.moc"

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多