C++ QObject::connect()出错
我正在尝试运行QTimer,并让它在超时时警告我。为此,我使用slot和signal将两者链接起来 那个家伙。h: 但作为输出,我得到了以下错误:C++ QObject::connect()出错,c++,qt,qtcore,qobject,qt-signals,C++,Qt,Qtcore,Qobject,Qt Signals,我正在尝试运行QTimer,并让它在超时时警告我。为此,我使用slot和signal将两者链接起来 那个家伙。h: 但作为输出,我得到了以下错误: No matching function for call to 'QObject::connect(QTimer*&, const char*, Guy* const, const char*)' 正如我在下面所说的,QTimer不需要作为函数connect的第一个输入的QObject,但是文档指定QTimer从QObject继承。 这里
No matching function for call to 'QObject::connect(QTimer*&, const char*, Guy* const, const char*)'
正如我在下面所说的,QTimer不需要作为函数connect的第一个输入的QObject,但是文档指定QTimer从QObject继承。
这里我没有任何线索。您也需要从QoObject继承,以使其工作,因为信号和插槽可用于QoObject。QGraphicsItem不继承QObject,甚至不间接继承 不仅如此,还需要添加Q_对象宏,如下所示:
class Guy : public QObject, public QGraphicsItem
{
Q_OBJECT
...
}
甚至更好,因为QGraphicsObject继承了QObject和QGraphicsItem
...
#include <QGraphicsObject>
...
class Guy : public QGraphicsQObject
{
Q_OBJECT
...
}
另外,如果进行此更改,我建议将QObject::connect更改为connect,因为您不需要指示QObject::scope
另一方面,包括stdio.h在这里似乎没有意义
此外,在堆上分配QTimer实例对我来说是浪费。它不仅会泄漏内存,还会增加额外的复杂性。即使在堆上分配,也应该将其作为父级传递,并使用初始值设定项列表或C++11样式的初始化。另外,如果您在堆上分配它,您可以在头中使用前向声明
如果插槽未在类外使用,则还应将其设置为私有
将计时器成员公开可能也是一个坏主意。希望您不要这样做。您也需要从QObject继承,以使其工作,因为信号和插槽可用于QObject。QGraphicsItem不继承QObject,甚至不间接继承 不仅如此,还需要添加Q_对象宏,如下所示:
class Guy : public QObject, public QGraphicsItem
{
Q_OBJECT
...
}
甚至更好,因为QGraphicsObject继承了QObject和QGraphicsItem
...
#include <QGraphicsObject>
...
class Guy : public QGraphicsQObject
{
Q_OBJECT
...
}
另外,如果进行此更改,我建议将QObject::connect更改为connect,因为您不需要指示QObject::scope
另一方面,包括stdio.h在这里似乎没有意义
此外,在堆上分配QTimer实例对我来说是浪费。它不仅会泄漏内存,还会增加额外的复杂性。即使在堆上分配,也应该将其作为父级传递,并使用初始值设定项列表或C++11样式的初始化。另外,如果您在堆上分配它,您可以在头中使用前向声明
如果插槽未在类外使用,则还应将其设置为私有
将计时器成员公开可能也是一个坏主意。希望您不要这样做。您可以继承QGraphicsObject,它为所有需要信号、插槽的图形项提供基类,并继承QGraphicsItem和QObject。还可以在类声明中添加Q_对象宏。您可以继承QGraphicsObject,它为所有需要信号、插槽的图形项提供基类,并继承QGraphicsSitem和QObject。还可以在类声明中添加Q_对象宏。如果使用新的Qt5样式连接,如中所示
QObject::connect(timer, &QTimer::timeout, this, &Guy::onTimeOutTimer)
onTimeOutTimer函数不需要标记为插槽,Guy可以保持为非QObject。更细,所涉及的宏更少。如果使用新的Qt5样式连接,如中所示
QObject::connect(timer, &QTimer::timeout, this, &Guy::onTimeOutTimer)
onTimeOutTimer函数不需要标记为插槽,Guy可以保持为非QObject。更细,涉及的宏更少。信号和插槽仅适用于QObject的子类,QGraphicsItem不是一个信号,插槽仅适用于QObject的子类,QGraphicsItem不是一个。但是在继承QObject时,我得到了以下结果:staticMeaObject不是QGraphicsItem的成员,qt_metacast不是QGraphicsItem的成员,qt_metacall不是QGraphicsItem的成员。它正在深入。您可以尝试运行qmake并在完成这些操作后重建项目changes@wipman:您需要重新运行mocs,如果您运行qmake,这会自动发生。请注意,如果您有很多图形项目,请注意QObject是非常重的。但是在继承QObject时,我得到了以下结果:staticMeaObject不是QGraphicsItem的成员,qt_metacast不是QGraphicsItem的成员,qt_metacall不是QGraphicsItem的成员。它正在深入。您可以尝试运行qmake并在完成这些操作后重建项目changes@wipman:您需要重新运行MOC,如果您运行qmake,这会自动发生。请注意,如果您有很多图形项目,请注意QObject相当重