【问题标题】:No matching function for QObject::connectQObject::connect 没有匹配的函数
【发布时间】:2014-08-16 02:27:51
【问题描述】:

我正在编写一个每 10 毫秒发送一个 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*&, const char*, clientSupervision* const, const char*)

我不明白为什么connect函数找不到匹配的函数。

我应该改变什么?

【问题讨论】:

  • 你的类应该继承 QObject。否则 Qt 信号/槽机制将不起作用。
  • @FinalContest 感谢您的帮助,我很快就会见到您,我对该代码还有另一个问题^^
  • @EvansBelloeil:当然,np。不要担心我们得到的反对票。它们都无法解释,因此无需担心。 :)
  • @ipapp 我也同意你的看法。无法解释的反对票通常没什么好担心的。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    但如果你明确地转换:

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

    【讨论】:

    • 是的,这就是原因!谢谢!
    【解决方案3】:

    这是另一个偷偷摸摸的问题:槽对象的类已在标头中前向声明,但未在实现中通过包含其标头来定义。

    【讨论】:

      【解决方案4】:

      这个问题一般有几个原因:

      • 你没有继承 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

      【讨论】:

      • 这改变了我的错误: undefined reference to `vtable for clientSupervision'
      • @EvansBelloeil:您需要正确生成 moc,但这是另一个问题。如果你使用 qmake 这应该可以工作,否则在你的源文件末尾包含“foo.moc”。你可能还需要一个 ~clientSupervision() 析构函数。
      猜你喜欢
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多