我正在尝试使用以下使用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'的一部分。
答案 0 :(得分:4)
您的短代码存在很多问题,但我会将重点放在其中最重要的部分。
一般的做法是:
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"