22

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

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

这是我的代码。

h 文件

...
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 *)”

任何的想法?

4

3 回答 3

47

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

于 2013-11-10T06:17:21.200 回答
22

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

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

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

这种语法的好处是你只需要指定函数的地址而不用关心参数,所以如果你在函数中改变它们,你不需要在连接语句中更新它们。

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

于 2013-11-11T09:12:59.113 回答
6

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

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

我这里根据zeta的帖子其他帖子做一个简单的总结

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

  1. 检查您的类是否继承QObject自 QObject 或任何派生类
  2. Q_OBJECT在类定义中附加宏
  3. 在您的活动的私人/受保护/公共关键字之后或slots之后Q_SLOTS
  4. 如果你确实检查了 1-3,那么clean运行 qmake并再次重建以确保 1-3 中的所有内容都是由moc生成的。

最后,这里有一个例子:

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

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

希望这可以挽救他人的生命

于 2018-03-15T04:30:27.340 回答