我正在尝试运行QTimer
并在timeout
时向我发出警告。为此,我使用slot
和signal
来关联这两者。
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
。
我不知道这里。
答案 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
,它为需要信号,广告位和继承QGraphicsItem
和QObject
的所有图形项提供基类。还要在类声明中添加Q_OBJECT
宏。
答案 2 :(得分:1)
如果你使用新的Qt5样式连接,如
QObject::connect(timer, &QTimer::timeout, this, &Guy::onTimeOutTimer)
onTimeOutTimer
函数不需要标记为slot,Guy
可以保留为非QObject。涉及的范围更细,更少。