Reputation: 2577
I checked other similar questions and tried their solutions but they don't work for me.
I'm basically trying to make a http client that only makes post requests. In order to do this, I need to connect QNetworkManager
's finished signal to some callback slot.
Here's my code.
h file:
...
public slots:
void finishedSlot(QNetworkReply* reply);
private:
QNetworkAccessManager *network_manager;
...
cpp file:
...
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
}
...
As you can see, the slot is definitely present and it is declared under public slots in header file. So I have no idea why this is happening. I already tried clean, run qmake, and rebuild.
The error message is:
"QObject::connect: No such slot QObject::finishedSlot(QNetworkReply *)"
Any idea?
Upvotes: 22
Views: 34997
Reputation: 73
I share another possible problem here as this post is the top most in google search.
In addition to add Q_OBJECT
, you must also add public slots:
or public Q_SLOTS:
for your customized event. Otherwise, you'll still encounter the QObject::connect: No such slot
error.
I give a brief summary here according to Zeta's post and the other post
To solve “No such slot” error
, you must check..
- Check if your class inherits
QObject
or any derived class from QObject- Append
Q_OBJECT
macro inside the class definition- Append
slots
orQ_SLOTS
after your private/protected/public keyword for your event- If you do check 1-3, then clean, run qmake, and rebuild again to make sure all your things in 1-3 are generated by moc.
Finally, a example here:
class MyClass: public QObject { //check 1
Q_OBJECT //check 2
public slots: //check 3
void onEvent(int);
};
Hope this saves others' life
Upvotes: 6
Reputation: 27611
One thing to note; since you're using Qt 5, there's a new signal slot connection syntax, which will allow you to specify any function and not just those defined as slots.
In this situation you can do this: -
connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);
What's great about this syntax is that you just specify the address of the function and don't bother about the parameters, so if you change them in a function, you don't need to update them in the connect statements.
You still should be using the Q_OBJECT macro though and you can read more about the new syntax here.
Upvotes: 22