Используйте QTimer вне QObject - PullRequest
0 голосов
/ 02 декабря 2018

Итак, я написал свой собственный класс Personages.У него есть функция kill(), которая делает Персонажа «мертвым».

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

Что я хочу сделать, это после того, как он был убит, вызвать таймер, чтобы оживить Персонажа через 1 секунду.Чтобы вызвать такую ​​функцию:

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

Я делаю этот проект в Qt, и я пытался использовать QTimer, но, как я понял, его можно использовать только с QObject (мой классне QObject).Итак, мой вопрос: как мне этого добиться?

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

Окей, я пытался просто сделать так, чтобы это было Q_OBJECT.класс Personages является дочерним классом другого класса:

class Personages : public Objects

Итак, в Objects.h я сделал следующее:

class Objects: public QObject
{
    Q_OBJECT
...
}

Теперь Personages - тоже 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: нет такого слота Objects :: reincarnate () в .. \ AndenturesOfLolo \ personages.cpp: 1074


Окей, мне не нужно делать какой-либо классбыть Q_OBJECT.Ответ Али сработал именно так, как я хотел

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

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

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Теперь персонажи тоже Q_OBJECT, я прав?

Нет, Personages не наследует Q_OBJECT от Objects, но должно быть также Q_OBJECT дляслот reincarnate должен быть распознан.Создание суперкласса Personages a Q_OBJECT не делает Personages a Q_OBJECT классом - если бы это было так, вам бы никогда не пришлось объявлять QObject -производный класс как Q_OBJECT, и аналогично вы бы сделалиникогда не сможет создать подкласс QObject, который не был бы классом Q_OBJECT.

Попробуйте добавить строку Q_OBJECT в ваше определение для Personages и посмотрите, работает ли это.

0 голосов
/ 03 декабря 2018

Помогает ли это?

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