Qt 中在进行窗口程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使用定时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀个任务。定时器在很多场景下都会使⽤到,如弹窗⾃动关闭之类的功能等。
Qt 中的定时器分为 QTimerEvent 和 QTimer 这2个类。
示例代码1: 在UI界⾯上放置两个 Label 控件,⼀个让其1秒数字累加⼀次,⼀个让其2秒数字累加⼀次。
1、新建项⽬,在UI界⾯⽂件放置两个 Label 控件:
2、在 “widget.h” 头⽂件中声明 timerEvent() 函数,并定义两个整型变量 timer_id1、timer_id2:
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 重写定时器事件
void timerEvent(QTimerEvent* event);
private:
Ui::Widget *ui;
int timer_id1 = 0;
int timer_id2 = 0;
};
3、在 “widget.cpp” ⽂件中重写 timerEvent() 函数;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器
timer_id1 = startTimer(1000);
timer_id2 = startTimer(2000);
}
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId() == timer_id1) {
static int num1 = 1;
// lb1 每隔1秒加一次
ui->lb1->setText(QString::number(num1++));
}
if(event->timerId() == timer_id2) {
static int num2 = 1;
// lb2 每隔2秒加一次
ui->lb2->setText(QString::number(num2++));
}
}
效果如下:
代码示例: 在UI界⾯放置⼀个 Label 标签,两个按钮,分别是 “开始” 和 “停⽌” ,当点击 “开始” 按钮时,开始每隔1秒计数⼀次,点击 “停⽌” 按钮时,暂停计数。
1、设计 UI 界⾯如下:
2、在 “widget.cpp” ⽂件中实现对应功能;
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer* time = new QTimer(this);
connect(ui->btn1, &QPushButton::clicked, [=](){
time->start(1000);
});
connect(time, &QTimer::timeout, [=](){
static int num = 1;
ui->label->setText(QString::number(num++));
});
connect(ui->btn2, &QPushButton::clicked, [=](){
time->stop();
});
}
实现效果如下:
在 Qt 中,获取系统的日期及实时时间可以通过 QTimer 类 和 QDateTime类。
QDateTime 类提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定,可用的参数列表如下:
代码示例: 获取系统日期及实时时间;
1、设计UI界面文件;放置⼀个 Label 控件,⽤来显示日期及时间,放置两个按钮:“开始” 和 “停止” ;
2、在 “widget.h” 头⽂件中声明更新时间的槽函数 TimeUpDate();
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
public slots:
void TimeUpDate();
};
3、在 “widget.cpp” ⽂件中实现对应功能;
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QDateTime>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer* time = new QTimer(this);
connect(ui->btn1, &QPushButton::clicked, [=](){
time->start(1000);
});
connect(ui->btn2, &QPushButton::clicked, [=](){
time->stop();
});
connect(time, &QTimer::timeout, this, &Widget::TimeUpDate);
}
void Widget::TimeUpDate()
{
QString str = QDateTime::currentDateTime().toString("yyyy-MM-dd hh::mm::ss");
ui->label->setText(str);
}
实现的效果如下: