我检查了其他类似的问题并尝试了他们的解决方案,但它们对我不起作用。
我基本上是在尝试制作一个只发出发布请求的 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: no so slot QObject::doneSlot(QNetworkReply *)"
知道吗?
您可能忘记使用Q_OBJECT
宏。每个实现自己的插槽/信号的类都需要该宏。不要忘记,您需要将头文件/源文件添加到 .pro 文件中。
需要注意的一件事;由于您使用的是Qt 5,因此有一种新的信号槽连接语法,它将允许您指定任何函数,而不仅仅是那些定义为插槽的函数。
在这种情况下,您可以这样做: -
connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);
这种语法的优点在于,您只需指定函数的地址,而不必为参数而烦恼,因此,如果您在函数中更改它们,则无需在 connect 语句中更新它们。
不过,您仍然应该使用 Q_OBJECT 宏,您可以在此处阅读有关新语法的更多信息。
我在这里分享另一个可能的问题,因为这篇文章是谷歌搜索中最重要的。
除了添加Q_OBJECT
,还必须为自定义事件添加public slots:
或public Q_SLOTS:
。否则,您仍会遇到QObject::connect: No such slot
错误。
我根据Zeta的帖子和另一篇文章在这里做一个简短的总结
要解决“No such slot” error
,您必须检查。
- 检查您的类是否继承了
QObject
或来自 QObject 的任何派生类- 在类定义中追加
在Q_OBJECT
宏- 活动的私人/受保护/公共关键字后附加
如果您确实检查了 1-3slots
或Q_SLOTS
- ,则清理、运行 qmake,然后再次重建以确保 1-3 中的所有内容都是由 moc 生成的。
最后,这里有一个例子:
class MyClass: public QObject { //check 1
Q_OBJECT //check 2
public slots: //check 3
void onEvent(int);
};
希望这能挽救他人的生命