No matching function for QObject::connect

36,076

Solution 1

There can be several reasons for the issue in general:

  • You do not inherit QObject.

  • You do not have the Q_OBJECT macro in your class.

  • You do not define the method as slot in your header file where the class is declared.

Your issue is the first which can be seen here:

class clientSupervision

You should change your code to:

class clientSupervision : public QObject
//                      ^^^^^^^^^^^^^^^^

Of course, the constructor implementation and signature would need to change, too, as follows:

explicit clientSupervision(QObject *parent = Q_NULL_PTR) : QObject(parent) { ... }

In addition, you seem to leak your QTimer instance as it does not get the parent as a parameter to the constructor.

Furthermore, the QObject:: scope is needless in your code as your class ought to inherit QObject directly or indirectly either way.

Even more, I would highly encourage you to utilize the new signal-slot syntax.

Solution 2

Another possible cause of this error is trying to connect to a slot which is overloaded. For example, this well cause the same error

QObject::connect(this,
                 &MazeWidget::MyUpdate,
                 this, 
                 &QWidget::update,
                 Qt::QueuedConnection);

But not if you explicitely cast:

QObject::connect(this,
                 &MazeWidget::MyUpdate,
                 this,
                 static_cast<void (QWidget::*)()>(&QWidget::update),
                  Qt::QueuedConnection);

Solution 3

Here's another one that snuck up on me: The class of the slot object had been forward declared in the header, but not defined in the implementation by including its header.

Share:
36,076
Evans Belloeil
Author by

Evans Belloeil

HCI Developer with ATM knowledge. This website saved me so many time I can't count.

Updated on July 05, 2022

Comments

  • Evans Belloeil
    Evans Belloeil almost 2 years

    I'm writing a program that send an UDP frame every 10 mS. Here's how my program is supposed to work :

    I've got a client class :

    //Constructor
    clientSupervision::clientSupervision()
    {
    }
    
    void clientSupervision::sendDataUDP(){
        //Create a frame and send it
    ...
    }
    
    void clientSupervision::sendDataUDPTimer(int timer){
        QTimer *tempsEnvoieTrameSupervision = new QTimer();//Create a timer
        tempsEnvoieTrameSupervision->setInterval(timer);//Set the interval
    
        //Mise en place des connections
        QObject::connect (tempsEnvoieTrameSupervision,SIGNAL (timeout()),this, SLOT (envoiTrameSupervision())); //Connect the timer to the function
        tempsEnvoieTrameSupervision->start();// Start the timer
    }
    
    //Call sendDataUDP
    void clientSupervision::envoiTrameSupervision(){
        std::cout << "Envoi de la trame de supervision";
        sendDataUDP();
    }
    

    My header file of clienSupervision.h :

    #ifndef CLIENTSUPERVISION_H
    #define CLIENTSUPERVISION_H
    #include <winsock2.h> // pour les fonctions socket
    #include <cstdio> // Pour les Sprintf
    #include "StructureSupervision.h"
    #include "utilitaireudp.h"
    #include <QTimer>
    #include <QObject>
    #include <iostream>
    class clientSupervision
    {
        Q_OBJECT
    public:
        clientSupervision();
        void sendDataUDP();
        void sendDataUDPTimer(int timer);
    
    public slots:
        void envoiTrameSupervision();
    };
    
    #endif // CLIENTSUPERVISION_H
    

    Then I use this in my main :

    int main(int argc, char *argv[])
    {
        clientSupervision c;
        c.sendDataUDPTimer(10);
        QCoreApplication a(argc, argv);
    
        return a.exec();
    }
    

    I've got the error :

    no matching function for call to 'QObject::connect(QTimer*&, const char*, clientSupervision* const, const char*)

    I don't understand why the connect function can't find a matching function.

    What should I change?

  • Evans Belloeil
    Evans Belloeil almost 10 years
    This change my error with : undefined reference to `vtable for clientSupervision'
  • László Papp
    László Papp almost 10 years
    @EvansBelloeil: you need to properly generate the moc, but that is another question. If you use qmake this ought to work, otherwise include "foo.moc" at the end of the source file of yours. You might also need to get a ~clientSupervision() destructor.
  • Aleksey Kontsevich
    Aleksey Kontsevich over 3 years
    Yep, this is the cause! Thanks!