Qt 定时器与定时事件

一、定时器

在头文件.h中进行声明:

private slots:
    void timeOut(); // 定时器超时槽函数

在.cpp中进行实现相应的功能:

// 构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    // 创建一个新的定时器
    QTimer *timer = new QTimer(this);
    // 设置定时器1秒钟超时
	timer->setInterval(100);        
    // 关联定时器的超时信号到槽上
    connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
	// 开始计时
    timer->start();      
}

// 定时器超时槽函数
void Widget::timeOut()
{
    
    
    QTime time = QTime::currentTime();      // 获取当前时间
    QString text = time.toString("hh:mm:ss");  // 转换为字符串
    if((time.second() % 2) == 0)
    {
    
    
        // 每隔一秒就将“:”显示为空格
        text[2]=' ';
        text[5]=' ';
    }
    qDebug() << text;
}

这里在构造函数中开启了一个 1 秒的定时器,当它溢出时就会发射 timeout() 信号,这时就会执行我们的定时器溢出处理函数。在槽里我们获取了当前的时间,并且将它转换为可以显示的字符串。
“应用程序输出”窗口输出如下:

"15:36:23"
"15 36 24"
"15:36:25"
"15 36 26"

如果我们想让这个计时器只计时一次,那么必须使用void setSingleShot(bool singleShot)函数

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
timer->setsetSingleShot(true)
timer->start(60000);

这样计时器只会倒计时 1 分钟,然后结束。

二、定时事件

QTimerEvent 类用来描述一个定时器事件。对于一个 QObject 的子类,只需要使用 int QObject::startTimer ( int interval) 函数来开启一个定时器,这个函数需要输人一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。当定时器溢出时就可以在 timerEvent() 函数中获取该定时器的编号来进行相关操作。
使用 QTimerEvent 的 timerId() 函数来获取定时器的编号,然后判断是哪一个定时器并分别进行不同的操作。
在头文件.h中进行声明:

private:
    Ui::Widget *ui;

    int id1,id2,id3; // 定时器的编号

protected:
    void timerEvent(QTimerEvent *event); // 定时器事件

在.cpp中进行实现相应的功能:

// 构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    id1 = startTimer(1000); // 开启一个1秒定时器,并返回其id
    id2 = startTimer(2000);
    id3 = startTimer(4000);
}

// 定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
    
    
    // 1秒钟时间到,则定时器1溢出
    if (event->timerId() == id1)
    {
    
    
        qDebug()<<"timer1";
    }
    else if(event->timerId() == id2)
    {
    
    
        qDebug()<<"timer2";
    }
    else if (event->timerId() == id3)
    {
    
    
        qDebug()<<"timer3";
    }
}

应用程序输出”窗口输出如下:

timer1
timer1
timer2
timer1
timer1
timer2
timer3

猜你喜欢

转载自blog.csdn.net/houxian1103/article/details/131266743