如何为每个对象实现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();
}
这段代码工作但是定时器应该在构造函数中间隔,并且两个对象都有相同的间隔!
你可以看到附加图像
问题是我想要启动,setInterval Timer与对象如:
person first;
first Name= "jack";
first.timer->start(200);
person second;
second Name "frank";
second.timer->start(500);
并在我的命令计时器开始工作后不在约束器
在我的代码中,当我尝试插入first.timer
ponter sign ->
没有出现问题!而且没有工作
答案 0 :(得分:2)
构造person
对象时,为每个对象实例获取每个数据成员变量的新副本。
因此,QObject* timer
和person 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指针并将其信号连接到这个实例插槽