Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

不多说,直入主题。
想要启用计时器事件,自然需要先在头文件里定义了:

1
2
protected:
void timerEvent(QTimerEvent *e);

可以通过在构造函数里调用startTimer来根据设置的触发时间来触发计时器事件:

1
startTimer(1000);  // 单位毫秒

比如这里我设置的就是每隔一秒触发一次。不过,一个类可以设置多个计时器,如:

1
2
startTimer(1000);  // 一秒一次
startTimer(500); // 500毫秒一次

那么如何区分是谁触发的计时器事件呢?我们来看一看这个函数的原型:

1
2
3
4
5
6
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)  // 函数原型
// 说明
Starts a timer and returns a timer identifier, or returns zero if it could not start a timer.
A timer event will occur every interval milliseconds until killTimer() is called. If interval is 0, then the timer event occurs once every time there are no more window system events to process.
The virtual timerEvent() function is called with the QTimerEvent event parameter class when a timer event occurs. Reimplement this function to get timer events.
If multiple timers are running, the QTimerEvent::timerId() can be used to find out which timer was activated.

可以看到,如果startTimer正常启动的话,会返回一个timer识别码,我们直接叫它timerID好了。我们可以根据这个TimerID来判断是谁触发了计时器事件,下面请看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 头文件
private:
int timerID1;
int timerID2;
// 构造函数
timerID1 = startTimer(1000);
timerID2 = startTimer(500);

// timerEvent事件

void MyWidget::timerEvent(QTimerEvent *e)
{
static int i1 = 0;
static int i2 = 0;
if(e->timerId() == timerID1)
{
QString qs = QString("<center>i1: %1</center>").arg(++i1);
ui->label->setText(qs);
if(i1 == 3)
{
killTimer(timerID1); // 关闭计时器
}
}
else if(e->timerId() == timerID2)
{
QString qs = QString("<center>i1: %1</center>").arg(++i2);
ui->label_2->setText(qs);
}
}

代码中定义了两个计时器,一个每一秒触发一次,一个每500毫秒触发一次。使用QTimerEvent.timerId()来获取当前触发事件的计时器的ID。当每秒触发一次的计时器触发3次时,使用killTimer()关闭该计时器。
下面是代码运行起来的演示图片:

那么相信看到这里,就已经明白这个事件该怎么玩了。
本篇完。(今天居然又水了三篇博客)

评论



愿火焰指引你