C++ QObject::connect 没有匹配的函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24410130/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
No matching function for QObject::connect
提问by Evans Belloeil
I'm writing a program that send an UDP frame every 10 mS. Here's how my program is supposed to work :
我正在编写一个程序,每 10 毫秒发送一个 UDP 帧。这是我的程序应该如何工作:
I've got a client class
:
我有一个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
:
我的头文件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
:
然后我在我的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*)
没有匹配的函数调用 '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?
我应该改变什么?
回答by lpapp
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.
您不继承 QObject。
您的班级中没有 Q_OBJECT 宏。
您没有在声明类的头文件中将方法定义为槽。
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.
此外,您似乎泄漏了 QTimer 实例,因为它没有将父对象作为构造函数的参数。
Furthermore, the QObject::
scope is needless in your code as your class ought to inherit QObject
directly or indirectly either way.
此外,QObject::
范围在您的代码中是不必要的,因为您的类应该以QObject
任何方式直接或间接继承。
Even more, I would highly encourage you to utilize the new signal-slot syntax.
更重要的是,我强烈建议您使用新的信号槽语法。
回答by Peter Mitrano
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);
回答by 2NinerRomeo
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.
这是另一个吸引我的地方:插槽对象的类已在标头中向前声明,但未在实现中通过包含其标头来定义。