QObject连接功能

时间:2013-11-10 06:13:02

标签: c++ qt qt5 qt-signals

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

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

这是我的代码。

h file

...
public slots:
   void finishedSlot(QNetworkReply* reply);
private:
    QNetworkAccessManager *network_manager;
...

cpp文件

...
Class1::Class1(){
    network_manager = new QNetworkAccessManager(this);
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
...
void Class1::finishedSlot(QNetworkReply* reply)
{
    // some logic with reply
}
...

如您所见,插槽肯定存在,并在头文件的公共插槽下声明。所以我不知道为什么会这样。我已经尝试过干净,运行qmake,然后重建。

错误消息是:

  

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

有什么想法吗?

3 个答案:

答案 0 :(得分:45)

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

答案 1 :(得分:18)

有一点需要注意;因为你正在使用Qt 5,所以有一个新的信号槽连接语法,它允许你指定任何功能,而不仅仅是那些被定义为槽的功能。

在这种情况下,你可以这样做: -

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);

这种语法的优点在于,您只需指定函数的地址,而不必担心参数,因此如果您在函数中更改它们,则无需在connect语句中更新它们。 / p>

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

答案 2 :(得分:5)

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

除了添加QObject之外,您还必须为自定义事件添加public slots:public Q_SLOTS:。否则,您仍会遇到QObject::connect: No such slot错误。

我根据Zeta's postthe other post

在此处做了简要总结

要解决“No such slot” error,您必须检查..

  
      
  1. 检查您的类是否从QObject继承QObject或任何派生类
  2.   
  3. 在类定义
  4. 中附加QObject宏   
  5. 在您的私人/受保护/公共关键字后添加slotsQ_SLOTS
  6.   
  7. 如果您检查1-3,则清除运行qmake ,然后重新重建以确保1-3中的所有内容都由{{3 }}。
  8.   

最后,这里有一个例子:

class MyClass: public QObject { //check 1
     Q_OBJECT //check 2

   public slots: //check 3
     void onEvent(int);
};

希望这能拯救他人的生命