1

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

「replyFinished」スロットを実装するために、QNetworkAccessManager から継承しました。シグナル「終了」は、すでに「QNetworkAccessManager」の一部です。

4

2 に答える 2

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
于 2014-12-25T23:23:51.547 に答える
0

QtCreator を使用している場合は、testing.cpp の最後にこの行を追加してみてください。

#include "testing.moc"
于 2014-12-25T23:19:31.917 に答える