Qt中的错误:当使用带有线程的Qnetwork访问管理器时,“不是这样的插槽”

时间:2012-10-18 13:56:29

标签: qt signals-slots qthread qnetworkaccessmanager

我在QThread中使用QNetworkAccessManager时遇到了麻烦。 相同的功能在不使用线程的情况下正常工 我目前只使用一个线程,我还需要添加更多。

它会触发错误消息:“Object :: connect:没有这样的插槽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();

我想知道为什么相同的代码在没有线程而不是线程的情况下工作。 我处境艰难,任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

不要忘记,如果信号来自一个单独的线程,则需要启动捕获信号的线程的事件循环。阅读QThread的详细说明。并且不要忘记Q_OBJECT宏。

答案 1 :(得分:0)

您需要在类声明中添加Q_OBJECT宏

然后你需要用Qt的“moc”工具预处理头文件,并将生成的cpp文件添加到你的项目中。

一旦你将所有东西组合在一起它应该正常工作

答案 2 :(得分:0)

在您的标头文件中,您声明了 replyFinished

public slots:
         void replyFinished(QNetworkReply* reply);

但是,在源文件中,您连接到 replyFinish

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

QObject :: connect找不到 replyFinish ,因为它只是一个方法,而不是插槽。请连接到正确的插槽名称。

正如其他人所说,你需要Q_OBJECT