没有QObject :: connect的匹配函数

时间:2014-06-25 13:30:12

标签: c++ qt qtcore qobject qt-signals

我正在编写一个每10 mS发送一个UDP帧的程序。这是我的程序应该如何工作:

我有一个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函数找不到匹配的函数。

我应该改变什么?

4 个答案:

答案 0 :(得分:8)

一般来说,这个问题可能有几个原因:

  • 您不继承QObject。

  • 您的班级中没有Q_OBJECT宏。

  • 您没有将方法定义为声明类的头文件中的插槽。

您的问题是第一个可以在这里看到的问题:

class clientSupervision

您应该将代码更改为:

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

当然,构造函数实现和签名也需要更改,如下所示:

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

此外,您似乎泄漏了QTimer实例,因为它没有将父项作为构造函数的参数。

此外,QObject::范围在您的代码中是不必要的,因为您的类应该直接或间接地继承QObject

更重要的是,我强烈建议您使用the new signal-slot syntax

答案 1 :(得分:1)

此错误的另一个可能原因是尝试连接到过载的插槽。例如,这个井导致相同的错误

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

但是,如果你明确表示:

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

答案 2 :(得分:1)

这又是一个秘密:插槽对象的类已在标头中预先声明,但在实现中并未通过包含其标头进行定义。

答案 3 :(得分:0)

如果以上答案均无效,请检查是否已为信号和插槽分配了正确的对象。当信号和插槽有效且引用一个对象,但分配给该信号和插槽的对象不同时,将出现此错误。