gpt4 book ai didi

c++ - QObject::connect() 错误

转载 作者:行者123 更新时间:2023-11-30 01:16:24 25 4
gpt4 key购买 nike

我正在尝试运行 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 样式初始化。此外,如果您在堆上分配它,则可以在 header 中使用前向声明。

如果插槽不在类外使用,您也应该将其设为私有(private)。

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

关于c++ - QObject::connect() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com