我正在使用QTimer
来平滑地更改标签的大小:当我将鼠标悬停在按钮上时,标签应该缓慢增长,并在鼠标离开按钮时缓慢折叠(减小其大小,直到消失)。
我的表单类(class)有两个计时器:
QTimer oTimer, cTimer;//oTimer for expanding, cTimer for collapsing
在表单的构造函数中,我要设置计时器的值,并将按钮的
mouseOver
和mouseOut
信号连接到表单的插槽:oTimer.setInterval( 25 );
cTimer.setInterval( 25 );
connect( ui.Button,
SIGNAL(mouseEntered(QString)),
this,
SLOT(expandHorizontally(QString)) );
connect( ui.Button,
SIGNAL(mouseLeft(QString)),
this,
SLOT(compactHorizontally(QString)) );
现在,在这些插槽中,我将相应的计时器连接到将逐渐改变大小的插槽,然后启动计时器:
void cForm::expandHorizontally(const QString & str)
{
ui.Text->setText( str );
connect( &oTimer, SIGNAL(timeout()), this, SLOT(increaseHSize()) );
cTimer.stop();//if the label is collapsing at the moment, stop it
disconnect( &cTimer, SIGNAL(timeout()) );
oTimer.start();//start expanding
}
void cForm::compactHorizontally(const QString &)
{
connect( &cTimer, SIGNAL(timeout()), this, SLOT(decreaseHSize()) );
oTimer.stop();
disconnect( &oTimer, SIGNAL(timeout()) );
cTimer.start();
}
之后,标签开始更改其大小:
void cForm::increaseHSize()
{
if( ui.Text->width() < 120 )
{
//increase the size a bit if it hasn't reached the bound yet
ui.Text->setFixedWidth( ui.Text->width() + 10 );
}
else
{
ui.Text->setFixedWidth( 120 );//Set the desired size
oTimer.stop();//stop the timer
disconnect( &oTimer, SIGNAL(timeout()) );//disconnect the timer's signal
}
}
void cForm::decreaseHSize()
{
if( ui.Text->width() > 0 )
{
ui.Text->setFixedWidth( ui.Text->width() - 10 );
}
else
{
ui.Text->setFixedWidth( 0 );
cTimer.stop();
disconnect( &cTimer, SIGNAL(timeout()) );
}
}
问题:最初一切都顺利,标签缓慢打开和关闭。但是,如果这样做几次,它将开始每次都越来越快地更改大小(就像计时器的间隔越来越小,但显然不是这样)。最终,在几次打开/关闭之后,当我将鼠标悬停在按钮上时,它开始立即将其大小增大到最大,当鼠标离开按钮时,它立即折叠为零大小。
这可能是什么原因?
最佳答案
我建议事件正在等待处理,排队事件的数量随时间增加。可能是因为一个事件在两个计时器事件之间未完全处理,或者是由于程序的其他部分所致。
您为什么不只使用一个计时器?通过仅将插槽用于尺寸更改事件,您甚至可以走得更远。其他插槽仅用于更改更改类型:
void cForm::connectStuff(){
connect( &oTimer, SIGNAL(timeout()), this, SLOT(changeSize()) );
connect(
ui.Button,
SIGNAL(mouseEntered(QString)),
this,
SLOT(expandHorizontally())
);
connect(
ui.Button,
SIGNAL(mouseLeft(QString)),
this,
SLOT(compactHorizontally())
);
}
void cForm::expandHorizontally(){
shouldExpand = true;
}
void cForm::compactHorizontally(){
shouldExpand = false;
}
void cForm::changeSize(){
if(shouldExpand)
increaseHSize();//call the function which expand
else
decreaseHSize();//call the function which compact
}
关于c++ - QTimer在每次启动/停止时变得更快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12528184/