在QObject之外使用QTimer

时间:2018-12-02 14:03:46

标签: c++ qt timer qtimer

因此,我编写了自己的课程Personages。它具有一个函数kill(),使Personage成为“死亡”。

void Personages::kill()
{
    this->alive = false;
}

我想做的是杀死它后,调用一个计时器使Personage在1秒内再次存活。要调用这样的函数:

void Personages::reincarnate()
{
    this->alive = true;
}

我在Qt中创建了这个项目,并且尝试使用QTimer,但是据我了解,它只能与QObject一起使用(我的课程不是QObject)。所以我的问题是如何实现呢?

 void Personages::kill()
    {
        this->alive = false;
        ????
    }

Okey,我尝试只是使其成为Q_OBJECT。人员是其他类别的子类别:

class Personages : public Objects

因此,在Objects.h中,我完成了以下操作:

class Objects: public QObject
{
    Q_OBJECT
...
}

现在人物也是Q_OBJECT,对吗? 人员具有以下功能(.h):

    void            kill();
private slots:
    void            reincarnate();

这是代码:

void Personages::kill()
{
    this->alive = false;
    this->timer = new QTimer(this);
    connect(this->timer, SIGNAL(timeout()), this, SLOT(reincarnate()));
    this->timer->start(1000);
}

void Personages::reincarnate()
{
    this->alive = true;
    this->timer->stop();
    delete this->timer;
}

它可以编译,但是死者仍然没有活着。问题是什么? 我有这个错误: QObject :: connect:.. \ AndenturesOfLolo \ personages.cpp:1074

中没有此类插槽Objects :: reincarnate()

Okey,我不需要做任何课程就可以成为Q_OBJECT。阿里的答案完全符合我的要求

void Personages::kill()
{
    this->alive = false;
    QTimer::singleShot(5000, [=]() { reincarnate(); });
}

void Personages::reincarnate()
{
    this->alive = true;
}

2 个答案:

答案 0 :(得分:0)

有帮助吗?

QTimer::singleShot(2000, [=]() { foo(); });

答案 1 :(得分:0)

  

现在人物也是Q_OBJECT,对吗?

否,Personages不会从Q_OBJECT继承Objects,但也必须是Q_OBJECT,才能识别插槽reincarnate。使Personages的超类成为Q_OBJECT并不会使Personages成为Q_OBJECT的类-如果这样做,则您将不必声明源自QObject的类类作为Q_OBJECT,类似地,您将永远无法创建不是 QObject类的Q_OBJECT子类。

尝试将Q_OBJECT行添加到Personages的定义中,看看是否行得通。