【问题标题】:error in Qt:' Not such Slot ' when Using Qnetwork access manager with threadsQt 中的错误:使用带有线程的 Qnetwork 访问管理器时出现“不是这样的插槽”
【发布时间】:2012-10-18 13:56:28
【问题描述】:

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

它会触发错误消息:“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();

我想知道为什么相同的代码没有线程而不是线程。 我处境艰难,不胜感激。

【问题讨论】:

  • 每个类中都需要一个Q_OBJECT 宏来定义槽和信号。
  • Q_OBJECT 不工作,我已经尝试过了..它引发了一堆其他错误。 newthread.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall NewThread::metaObject(void)const" (?metaObject@NewThread@@UBEPBUQMetaObject@@XZ)
  • 那么您需要修复这些错误。该宏是必需的
  • error.newthread.obj:-1 的任何提示:错误:LNK2001:未解析的外部符号“public: virtual struct QMetaObject const * __thiscall NewThread::metaObject(void)const”
  • 清理构建并确保您使用的任何构建系统都在标题上调用moc

标签: qt signals-slots qthread qnetworkaccessmanager


【解决方案1】:

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

【讨论】:

  • 您没有创建事件循环。您应该只启动线程的事件循环。您可以通过调用 QThread 的 exec 方法来做到这一点。
【解决方案2】:

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

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

一旦你把所有东西一起构建起来,它应该可以正常工作

【讨论】:

  • 我对它进行了探索,它说 qmake 会自动执行(moc)..我将如何手动执行..我在 win7 上使用 Qt creator 4.8.x ..请帮助我qt 新手。
【解决方案3】:

在你的头文件中,你声明了 replyFinished

public slots:
         void replyFinished(QNetworkReply* reply);

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多