QObject connection function

34,405

Solution 1

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.

Solution 2

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.

Solution 3

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

Share:
34,405

Related videos on Youtube

CTheDark
Author by

CTheDark

Updated on February 01, 2020

Comments

  • CTheDark
    CTheDark over 4 years

    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?

    • peppe
      peppe over 10 years
      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.
    • peter70
      peter70 about 6 years
      You must not forget to specify your slot function (in the header file) in the "slots:" area
  • CTheDark
    CTheDark over 10 years
    Thanks a lot. I also had to clean/qmake/rebuild after adding that.
  • igleyy
    igleyy over 10 years
    Could you tell us if such a function has to be declared as static?
  • TheDarkKnight
    TheDarkKnight over 10 years
    The function does not need to be static, as a pointer to the instance is passed to the connect call.
  • igleyy
    igleyy over 10 years
    Ouuuwww, you're right! Before &Class1::finishedSlot we pass this. I just forgot all my Qt experiences :).
  • Kuba hasn't forgotten Monica
    Kuba hasn't forgotten Monica over 10 years
    @Charlemagne: Merely re-running quake on the project would have sufficed, I think. This can save time on large projects.
  • Jatin
    Jatin over 8 years
    @TheDarkKnight: Certainly helpful.! The error was just due to non-usage of this new syntax.