Запуск QPropertyAnimation задерживается

У меня есть небольшая анимация, показывающая / скрывающая рамку, когда мышь наводит родительский виджет (во фрагменте кода ниже "MyWidget").

Анимация просто изменяет свойство максимума ширины фрейма, так что фрейм становится видимым как некоторый "эффект скольжения". (Сам фрейм размещается в сетке.)

Мой вопрос, как запустить анимацию с задержкой? Пример: запуск через 500 мс после того, как мышь оставила событие, поэтому эффект выдвижения задерживается и не запускается сразу.

void MyWidget::enterEvent( QEvent * event )
{
    //slide-in effect
    QPropertyAnimation *animation = new QPropertyAnimation(ui.frame_buttons, "maximumWidth");
    animation->setDuration(1000);
    animation->setStartValue(ui.frame_buttons->maximumWidth());
    animation->setEndValue(100);
    animation->setEasingCurve(QEasingCurve::InOutQuad);

    animation->start();
}

void MyWidget::leaveEvent( QEvent * event )
{
    //slide-out effect
    QPropertyAnimation *animation = new QPropertyAnimation(ui.frame_buttons, "maximumWidth");
    animation->setDuration(1000);
    animation->setStartValue( ui.frame_buttons->maximumWidth() );
    animation->setEndValue(0);
    animation->setEasingCurve(QEasingCurve::InOutQuad);

    //delay start() for a small amount of time
    animation->start();
}

1 ответ

Решение

Намек от Меццо был нацеленным - еще раз спасибо! - но я вставил контролер, чтобы избежать "эффекта мерцания". (Постоянное ожидание статического количества миллисекунд может вызвать асинхронный эффект slideOut, когда эффект slideIn все еще работает.)

Для кого это может быть интересно ответ. (Я также исправил утечку памяти во избежание выделения в каждом триггере анимации):

void MyWidget::enterEvent( QEvent * event )
{
    //start from where the slideOut animation currently is
    m_slideInAnimation->setStartValue(ui.frame_buttons->maximumWidth());
    m_slideInAnimation->start();
}

void MyWidget::leaveEvent( QEvent * event )
{
    //start from where the slideIn animation currently is
    m_slideOutAnimation->setStartValue( ui.frame_buttons->maximumWidth() );

    //start slide_out animation only if slide_in animation finish to avoid flicker effect
    if(ui.frame_buttons->maximumWidth() != m_slideInAnimation->endValue()) 
    {
        m_slideOutAnimation->start();
    }
    else
    {
        QTimer::singleShot(700, m_slideOutAnimation, SLOT(start()));
    }   
}

void MyWidget::createAnimations()
{
    m_slideInAnimation= new QPropertyAnimation(ui.frame_buttons, "maximumWidth");
    m_slideInAnimation->setDuration(1000);
    m_slideInAnimation->setEndValue(100);
    m_slideInAnimation->setEasingCurve(QEasingCurve::InOutQuad);

    m_slideOutAnimation = new QPropertyAnimation(ui.frame_buttons, "maximumWidth");
    m_slideOutAnimation->setDuration(1000);
    m_slideOutAnimation->setEndValue(0);
    m_slideOutAnimation->setEasingCurve(QEasingCurve::InOutQuad);
}

void MyWidget::MyWidget()
{
    this->createAnimations();
}

void MyWidget::~MyWidget()
{
    delete m_slideInAnimation;
    delete m_slideOutAnimation;
}   
Другие вопросы по тегам