0

QThread で QNetworkAccessManager を使用する際に困っています。スレッドを使用しなくても、同じ機能が正常に機能します。現在使用しているスレッドは 1 つだけで、さらにいくつか追加する必要があります。

「Object::connect: No such slot QThread::replyFinished(QNetworkrReply*)」というエラー メッセージが表示されます。

ヘッダー ファイル コード (NewThread.h) は次のとおりです。

class NewThread: public QThread
{
    public slots:
         void replyFinished(QNetworkReply* reply);

    protected:
         void run();

    private: 


};

The source code file(NewThread.cpp ):

void NewThread::replyFinished(QNetworkReply *net_reply)
{
    QByteArray data = net_reply->readAll();
    QString str(data);    
}


void NewThread::run()
{

QNetworkAccessManager *manager;
        manager = new QNetworkAccessManager ();
        QNetworkRequest req;
        req.setUrl(QUrl("My url"));

        QByteArray postData;

        postData.append("some data string");


        req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

        manager->setCookieJar(new QNetworkCookieJar(manager));
        //Define the Request-url:
        connect (manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinish (QNetworkReply  *)));
        //Send the request:
        manager->post(req, postData);
}

void NewThread::replyFinish(QNetworkReply *reply)
{
     QString answer = QString::fromUtf8(reply->readAll());
     qDebug () << answer;
}

以下のように、別のクラスで NewThread クラスのオブジェクトを作成しています。

NewThread thread1;
thread1.start();

なぜ同じコードがスレッドではなくスレッドなしで機能するのか疑問に思っています。私は困難な状況にあり、助けていただければ幸いです。

4

3 に答える 3

0

クラス宣言に Q_OBJECT マクロを追加する必要があります

次に、Qt の「moc」ツールを使用してヘッダー ファイルを前処理し、生成された cpp ファイルをプロジェクトに追加する必要があります。

すべてを一緒に構築すると、正しく動作するはずです

于 2012-10-18T14:17:35.790 に答える
0

ヘッダー ファイルで、replyFinishedを宣言しました

public slots:
         void replyFinished(QNetworkReply* reply);

ただし、ソース ファイルでは、replyFinishに接続します。

connect (manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinish (QNetworkReply  *)));

QObject::connect は、スロットではなく単なるメソッドであるため、replyFinishを見つけることができません。正しいスロット名に接続してください。

他の人が言うように、必要Q_OBJECTです。

于 2012-10-19T09:41:15.203 に答える
0

シグナルが別のスレッドから来ている場合は、シグナルをキャッチするスレッドのイベント ループを開始する必要があることを忘れないでください。QThreadの詳細な説明を読んでください。Q_OBJECT マクロを忘れないでください。

于 2012-10-18T14:11:50.860 に答える