QObject :: connect()出错

时间:2014-11-01 03:26:33

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

我正在尝试运行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不需要QObject作为函数connect()的第一个输入,但文档指定QTimer继承自QObject 。 我不知道这里。

3 个答案:

答案 0 :(得分:2)

您还需要继承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样式初始化。此外,如果在堆上分配它,则可以在标题中使用前向声明。

如果在课堂外没有使用插槽,你也应该将其设为私有。

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

答案 1 :(得分:2)

您可以继承QGraphicsObject,它为需要信号,广告位和继承QGraphicsItemQObject的所有图形项提供基类。还要在类声明中添加Q_OBJECT宏。

答案 2 :(得分:1)

如果你使用新的Qt5样式连接,如

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

onTimeOutTimer函数不需要标记为slot,Guy可以保留为非QObject。涉及的范围更细,更少。