22
votes

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?

3
Notice that the error says QObject::finishedSlot. That means Qt doesn't know about your subclass. That means meta information about it wasn't generated. That means moc wasn't run on your class. That means your class is lacking the Q_OBJECT macro.peppe
You must not forget to specify your slot function (in the header file) in the "slots:" areapeter70

3 Answers

47
votes

You probably forgot to use the Q_OBJECT macro. Every class that implements its own slots/signals needs that macro. Don't forget that you need to add your header/source file to the .pro file.

22
votes

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.

6
votes

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..

  1. Check if your class inherits QObject or any derived class from QObject
  2. Append Q_OBJECT macro inside the class definition
  3. Append slots or Q_SLOTS after your private/protected/public keyword for your event
  4. 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