Qt
定时器事件Qt
中提供了两种方式实现定时器,第一种是通过 startTimer
的方式启动定时器,该函数返回定时器的 id
,然后我们需要为实现定时器的类重写 timerEvent
。第二种是 new
一个 QTimer
对象的方式,start
函数设置超时时间,connect
绑定超时触发的槽函数处理对应的事情。
我们先介绍这一种,创建 Qt Application
项目,项目默认的类名为 Widget
,继承自 QWidget
。
timerEvent
实现定时器我们在 QWidget
类里先声明三个定时器的 id
,并且声明我们要重写的 timerEvent
事件:
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
virtual void timerEvent(QTimerEvent *event);
private:
Ui::Widget *ui;
int id1;
int id2;
int id3;
};
接下来我们在构造函数中启动三个定时器:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 法一
id1 = startTimer(1000);
id2 = startTimer(2000);
id3 = startTimer(3000);
}
在析构函数中回收三个定时器:
Widget::~Widget()
{
delete ui;
killTimer(id1);
killTimer(id2);
killTimer(id3);
}
然后重写 timerEvent
,进而实现三个定时器的功能:
// 重写 QTimerEvent 类的 timerEvent 虚函数
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId() == id1){
qDebug() << "id1 timer triggered" << Qt::endl;
}
if(event->timerId() == id2){
qDebug() << "id2 timer triggered" << Qt::endl;
}
if(event->timerId() == id3){
qDebug() << "id3 timer triggered" << Qt::endl;
}
}
运行程序后,就可以看到三个定时器被调用,并且根据每个定时器的 id
输出信息。
QTimer
信号和槽实现定时器我们在 Widget
的声明中,添加一个槽函数:
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
virtual void timerEvent(QTimerEvent *event);
private:
Ui::Widget *ui;
int id1;
int id2;
int id3;
public slots:
void upload_current_time();
};
接下来我们在 Widget
的构造函数中初始化一个定时器,并且连接定时器发出的信号和槽函数,然后启动定时器:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 法一
id1 = startTimer(1000);
id2 = startTimer(2000);
id3 = startTimer(3000);
// 法二
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Widget::upload_current_time);
timer->start(1000);
}
然后我们在 ui
里添加一个 lcdNumber
的控件,用来显示当前的时间,然后在定时器的槽函数 upload_current_time 中设置 lcdNumber
显示时间信息:
// QTimer 定时器对象关联的槽函数
void Widget::upload_current_time()
{
QTime time = QTime::currentTime();
QString text = time.toString("hh;mm;ss");
qDebug() << " current time is " << Qt::endl;
if(time.second() % 2 == 0){
text[5] = ':';
text[2] = ':';
}
ui->lcdNumber->setDigitCount(text.length());
ui->lcdNumber->display(text);
}
程序运行后,就可以根据定时器每个一秒获取时间信息显示在 lcdNumber
上了。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。