Error with QObject::connect()

Error with QObject::connect()

本文关键字:connect Error QObject with      更新时间:2023-10-16

我正在尝试运行QTimer并在timeout时警告我。为此,我使用slotsignal将两者联系起来。

guy.h

#ifndef GUY_H
#define GUY_H
#include <QGraphicsItem>
#include <QTimer>
#include <QObject>
class Guy : public QGraphicsItem
{
public:
    Guy(int x, int y);
    void timerStart();
public slots:
    void onTimeOutTimer();
    [...]
    QTimer *timer;
}
#endif // GUY_H

guy.cpp

#include "guy.h"
#include <QTimer>
#include <QObject>
#include <stdio.h>
#include <iostream>
Guy::Guy(int x, int y)
{
    timer = new QTimer();
}
void Guy::timerStart()
{
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(onTimeOutTimer()));
    this->timer->setInterval(1000);
    this->timer->start();
    std::cout << "starting timer" << std::endl;
}
void Guy::onTimeOutTimer()
{
    std::cout << "check" << std::endl;
}

但是作为输出,我收到此错误:

No matching function for call to 'QObject::connect(QTimer*&, const char*, Guy* const, const char*)'

正如我所理解的,QTimer不需要作为函数connect()的第一个输入QObject,但文档指定QTimer继承自QObject。我在这里毫无头绪。

您还需要从 QObject 继承才能使其正常工作,因为信号和插槽可用于 QObjects。 QGraphicsItem不继承QObject,甚至间接继承。

不仅如此,您还需要添加Q_OBJECT宏,如下所示:

class Guy : public QObject, public QGraphicsItem
{
    Q_OBJECT
    ...
}

甚至更好,因为QGraphicsObject继承了QObject和QGraphicsItem。

...
#include <QGraphicsObject>
...
class Guy : public QGraphicsQObject
{
    Q_OBJECT
    ...
}

另外,如果您进行此更改,我建议将QObject::connect更改为connect,因为您不需要指示QObject::范围。

附带说明一下,包括stdio.h在这里似乎没有意义。

此外,在堆上分配 QTimer 实例对我来说似乎是浪费。它不仅会泄漏内存,还会增加复杂性。即使将其分配给堆,也应将其作为父项传递,并使用初始值设定项列表或 C++11 样式初始化。此外,如果在堆上分配它,则可以在标头中使用前向声明。

如果该槽未在类外使用,则还应将其设为私有。

公开计时器成员可能也是一个坏主意。希望你不要那样做。

您可以从QGraphicsObject继承,它为所有需要信号、插槽的图形项提供了一个基类,并继承了QGraphicsItemQObject。还要在类声明中添加Q_OBJECT宏。

如果您使用新的 Qt5 样式,请按

QObject::connect(timer, &QTimer::timeout, this, &Guy::onTimeOutTimer)

onTimeOutTimer功能不需要标记为插槽,Guy可以保持非 QObject。更纤薄,涉及的宏更少。