【问题标题】:Qt : No such slot QObject::SlotName(QNetworkReply*)Qt:没有这样的插槽 QObject::SlotName(QNetworkReply*)
【发布时间】:2015-03-23 22:11:44
【问题描述】:

我是 QT 新手,我正在尝试连接到 REST 服务并获取数据。我能够成功连接到我机器上的本地 tomcat,但是我收到了 slot not found 错误。请让我知道我可能做错了什么,我在 Qt 方面没有那么多专业知识,所以请多多包涵

Person.cpp:

#include "person.h"
 #include <QNetworkRequest>
#include <QNetworkAccessManager>
#include<QObject>
#include<QDebug>
#include<QNetworkReply>

Person::Person()
{

}

Person::~Person()
{

}
void Person::addPerson (){


    QString url_str = "http://localhost:8080/";

    Person *person = new Person;
    person->setAccountStatus (true);
    person->setFirstName ("Akshay");
    person->setId (0);
    person->setPassword ("helloWorld");
    person->setUsername ("akshay@gmail.com");

    QNetworkAccessManager *manager = new QNetworkAccessManager();

    QObject object;
    object.connect(manager,SIGNAL(finished(QNetworkReply*)),SLOT(slotRequestFinished(QNetworkReply*)));
    QNetworkRequest request;
    request.setUrl (url_str);
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
    QNetworkReply *reply = 0;
    manager->get(request);

}

void Person::slotRequestFinished(QNetworkReply *reply)
{
    qDebug()<<"Task finished";
}

人.h:

#ifndef PERSON_H
#define PERSON_H
#include<QString>
#include<QObject>
#include<QNetworkReply>

class Person
{
private:
     qint32 id;
     QString username;
     QString password;
     QString firstName;
     bool accountStatus;

public:
    Person();
    ~Person();

    qint32 getId() const;
    void setId(const qint32 &value);

    QString getUsername() const;
    void setUsername(const QString &value);

    QString getPassword() const;
    void setPassword(const QString &value);

    QString getFirstName() const;
    void setFirstName(const QString &value);

    bool getAccountStatus() const;
    void setAccountStatus(bool value);
    void addPerson();

public slots:
  void slotRequestFinished(QNetworkReply *reply);


protected:

    QList<Person> listPersons();


};

#endif // PERSON_H

}

我从 main.cpp 调用它:

Person *person = new Person;
person->addPerson ();

错误日志:

QML debugging is enabled. Only use this in a safe environment.
QObject::connect: No such slot QObject::slotRequestFinished(QNetworkReply*) in ../CheckNet/person.cpp:81
qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method

编辑:添加 QObject:

class Person : public QObject
{
    Q_OBJECT

private :
// values, getters and setters
}

当我执行上述操作时,我收到以下错误:

/home/akshay/Qtprojects/CheckNet/person.cpp:57: error: undefined reference to `vtable for Person'
/home/akshay/Qtprojects/build-CheckNet-Desktop_Qt_5_4_1_GCC_64bit-Debug/person.o:-1: In function `Person::~Person()':

【问题讨论】:

  • Person应该继承QObject,你需要在类声明中添加Q_OBJECT宏。
  • @vahancho : 你能检查一下我的帖子吗,之前我也尝试以上述方式添加 QObject 及其宏,但由于帖子中提到的错误而失败。
  • 按照 vahancho 告诉您的操作后,您是否尝试过重新运行 qmake 并重建整个项目?
  • Person.h 是否已添加到 .pro 文件中?例如。 HEADERS += Person.h.
  • @Slyps :是的,我想他的意思是我在编辑中粘贴的内容。

标签: c++ qt rest qt-signals


【解决方案1】:

简介

通过在新创建的 QObject(在您的 sn-p 中命名为 object)上使用非静态成员函数 QObject::connect,您实际上是在说提供的 SLOT 是对象的一部分您当前正在调用成员函数。

QObject object;
object.connect(...);
    // ^- almost always wrong (deleteLater is the only slot in `QObject`)

通过上面的逻辑,我们可以很容易地看到您描述的错误的原因; QObject 没有相关的插槽。



解决方案

您可以在真正具有所需SLOT(在您的情况下为Person)的对象上调用非静态QObject::connect,采用三个参数。

示例

// .- make sure `this` belongs to an object that inherits `QObject`
// v
   this->connect (
     manager, SIGNAL(finished(QNetworkReply*)), 
     SLOT(slotRequestFinished(QNetworkReply*))
   );

另一种选择是使用QObject 中的static 成员函数,其中第三个参数表示具有SLOT 的对象:

示例

QObject::connect (
  manager, SIGNAL(finished(QNetworkReply*)),
     this,   SLOT(slotRequestFinished(QNetworkReply*))
);

注意:上面this表示Person类型的对象,需要的上下文在Person的一个非静态成员函数内部,比如@ 987654340@ 在您的 sn-p 中。

注意:记住作为senderreceiver传递的对象必须继承自QObject,目前Person没有。

【讨论】:

  • 很棒的人,做到了。你能不能也给我一些关于 Qt 的资源,我来自 Java,所以对我来说有点不同。
  • @WeareBorg Qt Reference Documentation 是一个很好的资源,除了我建议使用 google 找到合适的学习资源。
  • @FilipRoséen-refp 感谢,我什至没有看他的连接尝试,并认为他没有摆脱 vtable 错误:D
  • 您还提到了 object.connect(...);错了,我该怎么办??
  • @WeareBorg 根本不使用这种方法。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多