QT 定时器事件

 UI

QT 定时器事件_第1张图片

一、通过 QTimer 类对象实现

1、头文件

1)引用 QTimer类 头文件,声明 QTimer 类对象  

2)声明 超时响应(槽函数)

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include //定时器类
#include //时间类
#include //定时器事件类
#include //日期时间类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();//按键响应槽函数
    void timeout_slot();//声明自定义超时响应槽函数

private:
    Ui::Widget *ui;

    //声明时间类对象
    QTimer t;

};
#endif // WIDGET_H

 2、在 原文件 中 定义按键响应函数 超时响应槽函数

1)在 Widget 的构造函数中 连接 信号与槽(因为只用连接一次)

2)定义按键响应槽函数

3)定义超时响应函数

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //信号与槽绑定
    connect(&t,&QTimer::timeout,this,&Widget::timeout_slot);
}

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

//定义按键响应槽函数
void Widget::on_pushButton_clicked()
{
    if(ui->pushButton->text() == "启动")
    {
        //启动定时器
        t.start(100);//间隔指定时间发送一个timeout的信号

        //更新按键文本
        ui->pushButton->setText("关闭");
    }else
    {
        //关闭定时器
        t.stop();

        //更新按键文本
        ui->pushButton->setText("启动");
    }
}

//定义超时响应函数
void Widget::timeout_slot()
{
    //static int num = 0;
    //ui->label->setNum(num++);

    //获取系统时间
    QTime systime = QTime::currentTime();
    //QTiem -> QString
    QString tm = systime.toString("hh:mm:ss");
    //更新label文本
    ui->label->setText(tm);

    //设置标签位置
    ui->label->setAlignment(Qt::AlignCenter);//完全居中
}

二、使用 事件处理函数 完成

        事件处理函数是 QTimerEvent类 中的一个虚函数,通过重载自定义功能

1、头文件

1)引用 QTimerEvent类 头文件 

2)声明 按键响应槽函数

3)定义一个 int 型 变量,用于记录 定时器id

4)声明 事件处理函数 重载

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include //定时器类
#include //时间类
#include //定时器事件类
#include //日期时间类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    //声明按键响应槽函数
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;

    int tid = 0;//定时器id号
    //声明 事件处理函数 重载
    void timerEvent(QTimerEvent *event) override;

};
#endif // WIDGET_H

2、原文件

1)定义按键响应槽函数

2)定义(重载)事件处理函数

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

}

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


//定义按键响应槽函数
void Widget::on_pushButton_2_clicked()
{
    if(ui->pushButton_2->text() == "启动")
    {
        //启动定时器
        tid = this->startTimer(100);//每隔100ms自动调用定时器事件处理函数

        //更新按键文本
        ui->pushButton_2->setText("关闭");
    }else
    {
        //关闭定时器
        t.stop();

        //更新按键文本
        ui->pushButton_2->setText("启动");
    }
}

//定义(重载)事件处理函数
void Widget::timerEvent(QTimerEvent *event)
{
    //判断定时器编号
    if(event->timerId() == tid)
    {
        ui->label_2->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
        ui->label_2->setAlignment(Qt::AlignCenter);
    }
}




你可能感兴趣的:(qt,开发语言)