Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QObject::connect()出错_C++_Qt_Qtcore_Qobject_Qt Signals - Fatal编程技术网

C++ QObject::connect()出错

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继承。 这里

我正在尝试运行QTimer,并让它在超时时警告我。为此,我使用slot和signal将两者链接起来

那个家伙。h:

但作为输出,我得到了以下错误:

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相当重