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