上次的360界面经过测试发现了一个bug,就是在窗口滚动的过程中再次点击按钮的话,页面会一直滚动到底层页面。
经过debug发现,在一个页面滚动没有结束的过程中再次点击会在以下代码处无限循环:
while(currentXpos < destXpos)
{
m_pLabelFg->move(currentXpos+WINDOW_PAGE_MOVE, WINDOW_START_Y);
currentXpos = m_pLabelFg->x();
qApp->processEvents(QEventLoop::AllEvents);//通过事件延时实现滚动效果
}
m_pLabelFg->move(destXpos, WINDOW_START_Y);
以上代码本是通过
qApp->processEvents(QEventLoop::AllEvents);进行延时实现滚动效果,但是这样做会在滚动的过程中继续监听其他事件,这样在滚动过程中再次点击会继续处理点击的事件,从而无限循环。
经过调试,已经更改掉了bug,以下是实现代码:
time1->start(10);//左移timer
time2->start(10);//右移timer
void DataBrain::onTimerOut1()
{
if(WINDOW_PAGE_MOVE >=(currentXpos-destXpos))
{
m_pLabelFg->move(destXpos, WINDOW_START_Y);//确保最后移到指定的位置
time1->stop();
}
m_pLabelFg->move(currentXpos-WINDOW_PAGE_MOVE, WINDOW_START_Y);
currentXpos = m_pLabelFg->x();
m_thislabel->move(thisMoveX+WINDOW_PAGE_MOVE/4,122);
thisMoveX=m_thislabel->x();
}
void DataBrain::onTimerOut2()
{
if( WINDOW_PAGE_MOVE >=(destXpos-currentXpos))
{
m_pLabelFg->move(destXpos, WINDOW_START_Y);
time2->stop();
}
m_pLabelFg->move(currentXpos+WINDOW_PAGE_MOVE, WINDOW_START_Y);
currentXpos = m_pLabelFg->x();
m_thislabel->move(thisMoveX-WINDOW_PAGE_MOVE/4,122);
thisMoveX=m_thislabel->x();
}
这样用timer事件来替代
qApp->processEvents(QEventLoop::AllEvents);的延时效果,这样就不会出现以上的bug了。
而且经测试,上一个版本在连续点击中间两个label时,会将每一次的位移都移动完才停下,就会造成点击结束还会不断的滚动。改过之后的代码也取消掉了这个bug,在timer的延时过程中再次触发事件,系统会将时间片分配给新的事件而结束掉原来的事件。
改后的源代码在http://download.csdn.net/detail/zhangyang1990828/5258719地址中。