1 Star 11 Fork 6

胡歌-此生不换/Qt-Project

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

Qt 定时器事件

定时器

Qt 中提供了两种方式实现定时器,第一种是通过 startTimer 的方式启动定时器,该函数返回定时器的 id,然后我们需要为实现定时器的类重写 timerEvent。第二种是 new 一个 QTimer 对象的方式,start 函数设置超时时间,connect 绑定超时触发的槽函数处理对应的事情。

我们先介绍这一种,创建 Qt Application 项目,项目默认的类名为 Widget,继承自 QWidget

1. 重写 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 输出信息。

2. 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 上了。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ax020913/qt-project.git
git@gitee.com:ax020913/qt-project.git
ax020913
qt-project
Qt-Project
master

搜索帮助