每个对象的C ++ Qt计时器

时间:2017-11-16 18:09:26

标签: c++ qt class timer

如何为每个对象实现Timer

例如我有这样的课程

---------------------------------------> person.h

#ifndef PERSON_H
#define PERSON_H

#include <QMainWindow>

namespace Ui {
class person;
}

class person : public QMainWindow
{
    Q_OBJECT

public:
    explicit person(QWidget *parent = 0);
    ~person();
    QString Name;
    QTimer *timer;

private:
    Ui::person *ui;
signals:

public slots:

    void onTimer();
private slots:

};

#endif // PERSON_H

person.cpp ----------------------&gt;

#include "person.h"
#include "ui_person.h"
#include <QString>
#include <QDebug>
#include <QTimer>

person::person(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::person)
{
    ui->setupUi(this);
    timer=new QTimer(this);
    connect(timer, SIGNAL(timeout()), this,SLOT(this->onTimer()));
    timer->start(1000);

}

person::~person()
{
    delete ui;
}



void person::onTimer()
{
    qDebug() << "timer call for "<< Name  ;

------------------&GT; main.cpp中

#include "person.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    person first;
    person second;
    first.Name="jack";
    second.Name="frank";




    return a.exec();
}

这段代码工作但是定时器应该在构造函数中间隔,并且两个对象都有相同的间隔!

OUtPut picture

你可以看到附加图像

问题是我想要启动,setInterval Timer与对象如:

person first;
first Name= "jack";
first.timer->start(200);
person second;
second Name "frank";
second.timer->start(500);

并在我的命令计时器开始工作后不在约束器

在我的代码中,当我尝试插入first.timer ponter sign ->没有出现问题!而且没有工作

2 个答案:

答案 0 :(得分:2)

构造person对象时,为每个对象实例获取每个数据成员变量的新副本。

因此,QObject* timerperson john都会有新的person frank

但是,timer只是一个指针,因此您需要在person类的构造函数中构造计时器。

timer = new QTimer();

如果您没有指定在计时器到期时接收通知的机制,那么计时器就没用了。

因此,您需要指定一个回调。

在C ++ 11和Qt5之前,计时器到期的回调必须是继承自QObject的类。

但是,随着C ++ 11和Qt5的出现,你可以使用lambdas作为回调函数,所以你可以按如下方式指定你的回调:

person::person()
{
    timer = new QTimer();
    QObject::connect(timer, QTimer::timeout, [this]()
        {
            this->onTimer();
        });
}

现在,当您拨打john.timer->start(2000)时,将在2秒后调用回叫person::onTimer

所以你需要创建一个回调函数,例如:

void person::onTimer()
{
    std::cout << timer called for " << Name.toStdString() << '\n';
}

您是使用QObject派生设计还是lambdas,取决于您的设计需求。

我建议在qt wiki上阅读Qt for Beginners

答案 1 :(得分:0)

首先你的计时器要做什么,因为如果它需要调用onTimeout的person类方法,你需要继承QObject并在你的类名下指定Q_OBJECT宏,然后创建处理信号来自的槽计时器和构造函数实例化你的qtimer指针并将其信号连接到这个实例插槽