Нет соответствующей функции для QObject::подключение

#qt #qt5 #signals-slots

Вопрос:

Я пишу программу, которая отправляет кадр UDP каждые 10 мС. Вот как должна работать моя программа :

У меня есть 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();
}
 

Мой заголовочный файл 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
 

Затем я использую это в своем main :

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

    return a.exec();
}
 

У меня ошибка :

нет соответствующей функции для вызова ‘QObject::connect(QTimer*amp;, const char*, clientSupervision* const, const char*)

Я не понимаю, почему функция connect не может найти соответствующую функцию.

Что я должен изменить?

Комментарии:

1. Ваш класс должен наследовать QObject. В противном случае механизм сигнала/слота Qt не будет работать.

2. @FinalContest Спасибо за вашу помощь, я скоро увижу вас, у меня есть еще один вопрос по этому коду ^^

3. @EvansBelloeil: конечно, нп. Не беспокойтесь о понижениях, которые мы получили. Все они необъяснимы, поэтому беспокоиться не о чем. 🙂

4. @ipapp Я тоже с вами согласен. Необъяснимые понижающие голоса обычно не означают ничего, о чем стоило бы беспокоиться.

Ответ №1:

В целом для этой проблемы может быть несколько причин:

  • Вы не наследуете QObject.
  • В вашем классе нет макроса Q_OBJECT.
  • Вы не определяете метод как слот в файле заголовка, в котором объявлен класс.

Ваша проблема-первая, которую можно увидеть здесь:

 class clientSupervision
 

Вам следует изменить свой код на:

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

Конечно, реализация конструктора и подпись также должны были бы измениться следующим образом:

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

Кроме того, вы, похоже, пропускаете свой экземпляр QTimer, поскольку он не получает родительский элемент в качестве параметра конструктора.

Кроме того, QObject:: область действия в вашем коде не нужна, так как ваш класс должен наследовать QObject прямо или косвенно в любом случае.

Более того, я бы настоятельно рекомендовал вам использовать новый синтаксис сигнальных слотов.

Комментарии:

1. Это изменяет мою ошибку с : неопределенной ссылкой на «vtable для clientSupervision»

2. @EvansBelloeil: вам нужно правильно сгенерировать moc, но это другой вопрос. Если вы используете qmake, это должно сработать, в противном случае включите «foo.moc» в конце вашего исходного файла. Возможно, вам также потребуется получить деструктор ~clientSupervision ().

Ответ №2:

Другой возможной причиной этой ошибки является попытка подключения к перегруженному слоту. Например, это может привести к той же ошибке

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

Но не в том случае, если вы явно бросите:

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

Комментарии:

1. Да, это и есть причина! Спасибо!

Ответ №3:

Вот еще одно, что подкралось ко мне: класс объекта slot был объявлен в заголовке, но не определен в реализации, включив его заголовок.

Ответ №4:

Если ни один из приведенных выше ответов не сработал, проверьте, правильно ли вы назначили объект сигналам и слотам. Вы получите эту ошибку, если сигналы и слоты действительны и относятся к одному объекту, но объект, назначенный этому сигналу и слоту, отличается.