#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:
Если ни один из приведенных выше ответов не сработал, проверьте, правильно ли вы назначили объект сигналам и слотам. Вы получите эту ошибку, если сигналы и слоты действительны и относятся к одному объекту, но объект, назначенный этому сигналу и слоту, отличается.