在制作界面的开发的过程中,定时器的应用无疑是重中之重,今天我们来看一下Qt中的定时器是什么样子的。Qt的定时器有两种QObject的定时器和QTimer类。
1.首先来熟悉一下定时器,定时器是指定一个规定时间,在时间超时后发出超时信号(timeout),然后根据超时信号,来触发事件,从而满足我们想要完成的功能。
2.我们先来看一下QObject中的定时器,在用startTimer()函数启动一个定时器后,在timerEvent(QTimerEvent*)函数来处理定时器事件,所以需要我们要重写 void timerEvent(QTimerEvent* ev)函数,在里面加上我们想要的处理方式如:
void timerEvent(QTimerEvent* ev)
{
//先确定是哪个定时器在工作
if (ev->timerId() == m_timerId) {
// 处理定时器事件
qInfo()<<__FUNCTION__;
change();
} else {
// 处理其他定时器事件
return ;
}
}
重要的一点,QObject中的定时器每个都有自己的id,是int类型的。为了区分不同定时器的使用。
int m_timerId;
m_timerId = startTimer(500);
//结束定时器
killTimer(m_timerId);
2.第二种就是我们的QTimer类中的定时器,我们需要新建一个QTimer类型的对象,在处理超时事件时我们要用connect()函数来进行链接,并在槽函数种定义超时事件的处理方式。
time=new QTimer(this);
//QTimer::timeout是超时信号,onTimerOut1是自定义的槽函数。
connect(time, &QTimer::timeout, this, &Widget::onTimerOut1);
//开起与结束
time->start(1000);
time->stop();
3.下面我们用定时器来实现一个简单的图片切换
首先看到我们在qrc文件种添加了五张图片,图片的路径名称相似方便我们做处理。
大家记住一定不要用中文路径,否则是加载不出来的。
我事先在ui界面添加了一个label控件名称是pixlabel,所以这里是这样调用的
void Widget::pixnint()
{
QString pixPath;
//pixPath.append(":/image/mode1.png");
static int Pixnum=1;
Pixnum++;
pixPath=QString(":/image/mode%1.png").arg(Pixnum);
//arg函数发挥了重要的作用,它让我们切换图片很方便。具体的用法就是,%1占位符里填充的就是arg()中的括号里的数。本例就把Pixnum也就是1放进了字符串%1的位置中。
qInfo()<<pixPath;
//QThread::msleep(10000);,阻塞进程一秒钟不要轻易使用
ui->pixlabel->setPixmap(QPixmap(pixPath));
//ui->pixlabel->setPixmap(QPixmap(":/image/mode1.png"));
ui->pixlabel->setScaledContents(true);
//设置一个小循环
if(Pixnum==5) Pixnum=0;
}
我们这里选择用槽函数来执行,也就是QTimer类的应用
void onTimerOut1()
{
qInfo()<<__FUNCTION__;
//change();
pixnint();
}
再在两个按钮中规定开始和结束
void Widget::on_autoshift_clicked()
{
time->start(1000);
//m_timerId = startTimer(500);
}
void Widget::on_pushButton_2_clicked()
{
time->stop();
//killTimer(m_timerId);
}
最后我们来看一下效果把
Widget 2024-03-24 11-21-03