QTimer如何以不同的时间间隔循环触发事件

xiaoyaoziqing 2013-04-17 04:50:38
有一个功能要求,每个一个时间间隔interval就在窗口显示一张图片。显示图片的函数已经写好了(doChangeImage()),当我设定interval为固定值时,用timer触发该函数,即可以正常的速度播放图像。现在我想根据cMI值的范围来指定不同的时间间隔interval,来实现改变图片播放速率的功能,下面是我的程序,我调试的时候,图片一次性的播放完成,根本无变速播放的情况出现,请问是哪里出问题了,谢谢?

for (int j = 0;j<micount; j++){

QString currentMI=list_MIresult[j];
float cMI=currentMI.toFloat();
if (cMI>=0.95)
{
if (interval<=20)
{
interval=20;
}
else
interval/=10;
}
else{
interval=500;
}

//timer是全局定时器,dochangeImage()实现每次在屏幕上刷新一张图片;
connect(timer, SIGNAL(timeout()), this, SLOT(doChangeImage()));

timer->start(interval,true);
}
...全文
1544 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCSE2012 2013-04-18
  • 打赏
  • 举报
回复
引用 14 楼 xiaoyaoziqing 的回复:
引用 13 楼 CCSE2012 的回复:我测试了一个例子,timer不必重新start只要setInterval就好,for循环改写一下用一个count计数次数控制 C/C++ code ? 1234567891011121314151617181920212223242526272829 //MainWindow的.h中 private……
共同进步,heh
xiaoyaoziqing 2013-04-18
  • 打赏
  • 举报
回复
引用 13 楼 CCSE2012 的回复:
我测试了一个例子,timer不必重新start只要setInterval就好,for循环改写一下用一个count计数次数控制 C/C++ code ? 1234567891011121314151617181920212223242526272829 //MainWindow的.h中 private: QTimer *timer; int count……
感谢CCSE2012,你的方法ok,谢谢。你的思路是通过计数器避开for循环和timer循环的冲突,这种方法很巧妙,学习了,呵呵,给分!
CCSE2012 2013-04-18
  • 打赏
  • 举报
回复
我测试了一个例子,timer不必重新start只要setInterval就好,for循环改写一下用一个count计数次数控制

//MainWindow的.h中
private:
    QTimer *timer;
    int count;
    int interval;
    int interval_array[20];
//MainWindow构造函数中
int tmp = 200;
    for(int i=0; i<20; i++)
    {
        interval_array[i]=tmp;
        tmp+=50;
    }
    count=0;
    interval = 200;
    timer = new QTimer();
    timer->start(interval);
    connect(timer,SIGNAL(timeout()),this,SLOT(change()));

//槽函数
void MainWindow::change()
{
    count ++;
    if(count == 20)timer->stop();
    interval=interval_array[count];
    timer->setInterval(interval);
    qDebug()<<QTime::currentTime().minute()<<":"<<QTime::currentTime().second()<<":"<<QTime::currentTime().msec();
}
xiaoyaoziqing 2013-04-17
  • 打赏
  • 举报
回复
结果还是以interval=3000的速度播放图像,没有我要的按不同的interval时间间隔区显示图像的功能。这是什么原因?
xiaoyaoziqing 2013-04-17
  • 打赏
  • 举报
回复
引用 10 楼 jdwx1 的回复:
引用 9 楼 xiaoyaoziqing 的回复: jdwx1,你好,那timer->setinterval(interval)这句,是不是应该保留,否则for循环的interval只是最后一个符合条件的值啊。是不是忘了? 要是放进循环里面,不就是第一个数据会timer->start,就是j == 0 的时候, j > 0之后的循环都没用了。 不管那个for有什么作用,timer->star……
我按你说的做了,time->start()放在外面,但是如何让每一个for循环中interval放到start中呢? 因为timer->stop()后,for循环完以后,timer->start(interval)才会起作用。
jdwx 2013-04-17
  • 打赏
  • 举报
回复
引用 9 楼 xiaoyaoziqing 的回复:
jdwx1,你好,那timer->setinterval(interval)这句,是不是应该保留,否则for循环的interval只是最后一个符合条件的值啊。是不是忘了?
要是放进循环里面,不就是第一个数据会timer->start,就是j == 0 的时候, j > 0之后的循环都没用了。 不管那个for有什么作用,timer->start只会第一次好用。
xiaoyaoziqing 2013-04-17
  • 打赏
  • 举报
回复
jdwx1,你好,那timer->setinterval(interval)这句,是不是应该保留,否则for循环的interval只是最后一个符合条件的值啊。是不是忘了?
jdwx 2013-04-17
  • 打赏
  • 举报
回复
    for (int j = 0;j<micount; j++){
        
        QString currentMI=list_MIresult[j];
        float cMI=currentMI.toFloat();
        if (cMI>=0.65){
            if (interval<=1){
                interval=1;
            } else{
                interval/=10;
                //QDebug("\033[32mHello!");
                std::cout<<"间隔时间是:"<<interval<<endl;                
            }
        }else{
            interval=3000;
        }
    }    
    timer->start(interval);
    
我改了一下,timer->start挪到for外面了。 原来timer->start在for里面,自然只有第一次start的interval有效。
xiaoyaoziqing 2013-04-17
  • 打赏
  • 举报
回复
引用 6 楼 heksn 的回复:
使用多个定时器呢
多个定时器如何按序触发同一个函数,又在什么时候进行stop和start,这些都有些问题?
  • 打赏
  • 举报
回复
使用多个定时器呢
xiaoyaoziqing 2013-04-17
  • 打赏
  • 举报
回复
引用 3 楼 jdwx1 的回复:
引用 1 楼 CCSE2012 的回复: 我理解这样写,timer的属性在start后是不会再改变的,timer不会动态改变自己的interval只是开始时调用一下。在doChangeImage内重新start可能会有用,但这个动态改变interval的这个for循环这样写的话不能和timer线程同步吧,这个变形一下,主体部分也写在doChangeImage中。我也是初学,说的对不对你参考一下吧……
按照你的意思,我改了代码,但是短点调试的时候,好像一直在timer->stop()到timer->setinterval(interval)这一段中循环。图像的刷新速度一直都是interval=3000时的速度,这是怎么回事? 下面是改后的代码: { connect(timer, SIGNAL(timeout()), this, SLOT(doChangeImage())); timer->start(interval); } void ShowWidget::doChangeImage() { emit get2beg(false); emit first(true); emit slider(true); //************************************改变定时器时间**********************************************// float *MI_array = new float[list_MIresult.size()]; //float mi; int micount=list_MIresult.size(); timer->stop(); for (int j = 0;j<micount; j++){ QString currentMI=list_MIresult[j]; float cMI=currentMI.toFloat(); if (cMI>=0.65) { if (interval<=1){ interval=1; } else{ interval/=10; //QDebug("\033[32mHello!"); std::cout<<"间隔时间是:"<<interval<<endl; } } else{ interval=3000; } timer->setInterval(interval); timer->start(interval); } //****************************
xiaoyaoziqing 2013-04-17
  • 打赏
  • 举报
回复
引用 1 楼 CCSE2012 的回复:
我理解这样写,timer的属性在start后是不会再改变的,timer不会动态改变自己的interval只是开始时调用一下。在doChangeImage内重新start可能会有用,但这个动态改变interval的这个for循环这样写的话不能和timer线程同步吧,这个变形一下,主体部分也写在doChangeImage中。我也是初学,说的对不对你参考一下吧
你的意思是把timer定时器的相关设置放在dochangeimage中?然后外面的interval先用原来的值。可以理解这样吗? {connect(timer, SIGNAL(timeout()), this, SLOT(doChangeImage())); timer->stop(); } void doChangeImage(){ for(){}//for循环改变interval值 timer->setInterval(interval); timer->start(interval); }
jdwx 2013-04-17
  • 打赏
  • 举报
回复
引用 1 楼 CCSE2012 的回复:
我理解这样写,timer的属性在start后是不会再改变的,timer不会动态改变自己的interval只是开始时调用一下。在doChangeImage内重新start可能会有用,但这个动态改变interval的这个for循环这样写的话不能和timer线程同步吧,这个变形一下,主体部分也写在doChangeImage中。我也是初学,说的对不对你参考一下吧 ……
可能是这个原因。 先把qtimer停下,setinterval,再start。
CCSE2012 2013-04-17
  • 打赏
  • 举报
回复
重新setInterval
CCSE2012 2013-04-17
  • 打赏
  • 举报
回复
我理解这样写,timer的属性在start后是不会再改变的,timer不会动态改变自己的interval只是开始时调用一下。在doChangeImage内重新start可能会有用,但这个动态改变interval的这个for循环这样写的话不能和timer线程同步吧,这个变形一下,主体部分也写在doChangeImage中。我也是初学,说的对不对你参考一下吧

16,798

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧