2014-12-25 31 views
1

構造我嘗試使用下面的代碼,它使用Qt庫未定義的引用與QNetworkAccessManager派生

#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(); 

} 

我收到以下錯誤,當我編譯讀取html頁面。我不確定我沒有以正確的方式做什麼。

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

不'SillyRequest'有任何虛擬方法? –

+0

在構造函數中,嘗試'connect(...,SLOT(SillyRequest :: replyFinished(QNetworkReply *))' – 0x499602D2

回答

4

有你的短碼這麼多的問題,但我會在下面重點放在那些最核心的部分。

包括建設部文件

一般的做法是這樣的:

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

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

int main(int argc, char **argv) 

的問題是,你們班是不是在單獨的頭文件和源文件等qmake的,所以商務部是在任何位置意識到這一點。

作爲一個方面說明,你也可以在這個特殊情況下內聯所有的方法。

獨立的頭文件和源

如果你不想,明確列入商務部實時生成(元對象編譯器)文件,這樣做,你就需要建立一個單獨的頭(最好來源)爲自己的類然後你可以在你的main.cpp文件中包含這個頭文件。這樣,你會做到這一點的main.cpp的開頭:

#include "sillyrequest.h" 

和自然,你可以按如下方式擴展的qmake項目文件:

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

爲什麼你建議在這種情況下使用內聯方法? – asla

+0

@Aslaville:1)方法,所以編譯器更加明確地將其優化,使其稍微更快。 2)代碼也會變得更短。 – lpapp

+0

恩,我明白了,謝謝 – asla

0

如果使用QtCreator,嘗試testing.cpp的底部加入這一行

#include "testing.moc"