Qt定时器处理
Qt的定时器只能通过纯代码实现,定时器顾名思义,主要作用是定时特定的时间。
Qt提供了定时器事件类QQTimerEvent
和定时器类QTimer
实现定时器操作。
定时器QTimer使用
Qt提供了更高层次的定时器编程接口**QTimer
**类,可以使用信号和槽,还可以设置定时一次。比较常用的方法有:
-
QTimer::setInterval(timeout)
:设置定时的时间,单位是ms; -
QTimer::start()
:启动定时器; -
QTimer::timeout()
:时间到发出信号timeout()
; -
QTimer::singleShot()
:只运行一次的定时器; -
QTimer::stop()
:停止定时器
QTimer
实现定时器功能大致步骤:
- 创建定时器对象,
QTimer *timer = new QTimer(this);
- 将定时器的超时信号与自定义的时间更新槽函数连接,也可以使用lambda表达式
connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
- 设置溢出时间,
timer->setInterval(1000);
- 定时器开始定时,
timer->start();
- 需要停止定时器调用
timer->stop()
即可。 - 具体代码可参考如下:
MyLCDNumber::MyLCDNumber(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyLCDNumber)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
// 关联定时器的超时信号都自定义槽函数中
connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
timer->setInterval(1000);
timer->start();
}
void MyLCDNumber::timerUpdate()
{
QTime time = QTime::currentTime();
QString text = time.toString("hh:mm:ss");
if(time.second() %2 ==0 ) // second()获取秒的值
{
text[5] = ' '; // 每隔1s将:显示为空格
}
ui->lcdNumber->display(text);
}
基于Lambda函数的实现方式
基于Lambda函数的实现方式仅绑定信号槽时不同,如下:
connect(m_timer,&QTimer::timeout,this,[=]()
{
// 处理定时内容
}
);
一次性定时器
实现如下,该种方式特定情况下非常适用,比如防止按钮不小心重复点击或双击时,可以在按钮的点击信号槽函数中使用
QTimer::singleSlot(1000,this,[=]{
// 定时器处理
});
防止按钮重复点击或双击:
ui->pushButton->setEnabled(false); // 使按钮使能关闭
QTimer::singleSlot(500,this,[=]{
ui->pushButton->setEnabled(true); // 500ms后按钮使能开启
});
使用QObject内部定时器事件类QTImerEvent,重写定时器事件实现定时器功能
重写定时器事件在需要多个定时器的时候,可以减少系统资源。QtimerEvent
类描述了一个定时器事件。
-
QObject
的子类可以使用startTimer()
可以开启一个定时器,该函数参数单位是毫秒,表示设定的时间,函数返回值表示这个定时器。当定时器到达指定的时间时会进入timerEvent()
函数进行需要的操作。 - 通过函数
timerId()
可以获取startTimer()
返回的定时器。 - 如果想要停止定时器调用
killTimer()
即可。
实现步骤:
-
头文件声明,重写定时器事件函数
timerEvent()
void timerEvent(QTImerEvent *event); // 重写定时器事件函数 int m_timerID; // 定时器ID
-
启动定时器
startTimer()
并返回定时器IDm_timerID = startTimer(1000); // 启动定时1s
-
处理定时器事件
void classname::timerEvent(QTimerEvent *event) { if(m_timerID == event->timerID()) // 判断定时器ID { // 处理ID为m_timerID的定时器事件 } else if(m_timerID2 == event->timerID()) { // 处理另一个定时器的事件 } }
-
在需要时关闭定时器
killTimer()
killTimer(m_timerID);
总结使用QTImerEven实现定时器的操作的步骤:文章来源:https://www.toymoban.com/news/detail-446948.html
- 使用
startTImer()
开启一个定时器;- 重写
timerEvent()
函数;- 需要关闭定时器时调用
killTimer()
;
当需要多个定时器时可以参考如下使用:文章来源地址https://www.toymoban.com/news/detail-446948.html
QList<int> timerIDList;
// ...
for(int i=0;i<100;i++)
timerIDList.append(startTimer(1000));
// ...
void calssname::timerEvent(QTimerEvent *event)
{
if(timerIDList.at(0) == event->timerID())
{
// 处理当前定时器
}
else if(timerIDList.at(0) == event->timerID())
{
// 处理当前定时器
}
// ...
}
到了这里,关于【Qt】定时器处理——定时器事件类QTimerEvent和定时器类QTimer使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!