Eva*_*eil 6 c++ qt qobject qt-signals qtcore
我正在编写一个每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();
}
Run Code Online (Sandbox Code Playgroud)
我的头文件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
Run Code Online (Sandbox Code Playgroud)
然后我用我的main:
int main(int argc, char *argv[])
{
clientSupervision c;
c.sendDataUDPTimer(10);
QCoreApplication a(argc, argv);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
我有错误:
调用'QObject :: connect(QTimer*&,const char*,clientSupervision*const,const char*)没有匹配函数
我不明白为什么connect函数找不到匹配的函数.
我应该改变什么?
lpa*_*app 11
一般来说,这个问题可能有几个原因:
您不继承QObject.
您的班级中没有Q_OBJECT宏.
您没有将方法定义为声明类的头文件中的插槽.
您的问题是第一个可以在这里看到的问题:
class clientSupervision
Run Code Online (Sandbox Code Playgroud)
您应该将代码更改为:
class clientSupervision : public QObject
// ^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
当然,构造函数实现和签名也需要更改,如下所示:
explicit clientSupervision(QObject *parent = Q_NULL_PTR) : QObject(parent) { ... }
Run Code Online (Sandbox Code Playgroud)
此外,您似乎泄漏了QTimer实例,因为它没有将父项作为构造函数的参数.
此外,QObject::代码中的范围是不必要的,因为您的类应该QObject直接或间接地继承.
更重要的是,我强烈建议您使用新的信号槽语法.
此错误的另一个可能原因是尝试连接到过载的插槽。例如,这口井会导致同样的错误
QObject::connect(this,
&MazeWidget::MyUpdate,
this,
&QWidget::update,
Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
但如果你明确地投射:
QObject::connect(this,
&MazeWidget::MyUpdate,
this,
static_cast<void (QWidget::*)()>(&QWidget::update),
Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21579 次 |
| 最近记录: |