C++ QObject连接函数

C++ QObject连接函数,c++,qt,qt5,qt-signals,C++,Qt,Qt5,Qt Signals,我检查了其他类似的问题并尝试了它们的解决方案,但它们对我不起作用 我基本上是在尝试创建一个只发出post请求的http客户端。为此,我需要将QNetworkManager的完成信号连接到某个回调插槽 这是我的密码 h文件: cpp文件: 正如您所看到的,插槽肯定存在,并且在头文件的公共插槽下声明。所以我不知道为什么会这样。我已经尝试过清理、运行qmake和重建 错误消息是: “QObject::connect:没有这样的插槽QObject::finishedSlot(QNetworkReply

我检查了其他类似的问题并尝试了它们的解决方案,但它们对我不起作用

我基本上是在尝试创建一个只发出post请求的http客户端。为此,我需要将
QNetworkManager
的完成信号连接到某个回调插槽

这是我的密码

h文件:

cpp文件:

正如您所看到的,插槽肯定存在,并且在头文件的公共插槽下声明。所以我不知道为什么会这样。我已经尝试过清理、运行qmake和重建

错误消息是:

“QObject::connect:没有这样的插槽QObject::finishedSlot(QNetworkReply *)"


有什么想法吗?

您可能忘了使用宏。每个实现自己的插槽/信号的类都需要该宏。不要忘记,您需要将头文件/源文件添加到.pro文件中。

需要注意的一件事;因为您使用的是Qt5,所以有一个新的信号插槽连接语法,它允许您指定任何函数,而不仅仅是那些定义为插槽的函数

在这种情况下,您可以执行以下操作:-

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);
这种语法的优点在于,您只需指定函数的地址,而不必关心参数,因此,如果在函数中更改它们,则不需要在connect语句中更新它们


你仍然应该使用Q_OBJECT宏,你可以阅读更多关于新语法的信息。

我在这里分享另一个可能的问题,因为这篇文章是谷歌搜索中最热门的

除了添加
Q\u对象
,您还必须为自定义事件添加
公共时段:
公共Q\u时段:
。否则,您仍然会遇到
QObject::connect:No-this-slot
错误

根据和,我在这里做一个简要的总结

若要解决“无此插槽”错误,必须检查

  • 检查您的类是否继承了
    QObject
    或任何来自QObject的派生类
  • 在类定义中追加
    Q_对象
  • 插槽
    Q_插槽
    附加在活动的private/protected/public关键字之后
  • 如果确实选中了1-3,则清理运行qmake,然后再次重建,以确保1-3中的所有内容都是由生成的
  • 最后,这里有一个例子:

    class MyClass: public QObject { //check 1
         Q_OBJECT //check 2
    
       public slots: //check 3
         void onEvent(int);
    };
    

    希望这能挽救其他人的生命

    注意,错误是QObject::finishedSlot。这意味着Qt不知道您的子类。这意味着没有生成关于它的元信息。这意味着
    moc
    没有在你的课堂上运行。这意味着您的类缺少
    Q_对象
    宏。您不能忘记在“slots:”区域中指定插槽函数(在头文件中)。我还必须在添加了/qmake/rebuild之后进行清理。@Charlemagne:我认为,仅仅在项目上重新运行quake就足够了。这可以在大型项目上节省时间。您能告诉我们这样一个函数是否必须声明为静态的吗?该函数不需要是静态的,因为指向实例的指针会传递给connect调用。哇哇,您说得对!在
    &Class1::finishedSlot
    之前,我们通过
    这个
    。我只是忘记了我所有的Qt体验:)。@thedarknight:当然很有帮助。!该错误只是由于未使用此新语法。
    connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);
    
    class MyClass: public QObject { //check 1
         Q_OBJECT //check 2
    
       public slots: //check 3
         void onEvent(int);
    };