我正在使用QTimer来平滑地更改标签的大小:当我将鼠标悬停在按钮上时,标签应该缓慢增长,并在鼠标离开按钮时缓慢折叠(减小其大小,直到消失)。

我的表单类(class)有两个计时器:

QTimer oTimer, cTimer;//oTimer for expanding, cTimer for collapsing

在表单的构造函数中,我要设置计时器的值,并将按钮的mouseOvermouseOut信号连接到表单的插槽:
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/

10-13 08:29