【问题标题】:Start QPropertyAnimation delayed延迟启动 QPropertyAnimation
【发布时间】:2015-11-02 14:13:30
【问题描述】:

当鼠标悬停在父窗口小部件上时,我有一个显示/隐藏框架的小动画(在“MyWidget”下方的代码 sn-p 中)。

动画只是改变了框架的 maximumWidth 属性,使框架变得可见,就像一些“滑入效果”。 (框架本身放置在网格布局中。)

我的问题是如何启动动画延迟?示例:鼠标离开事件后500ms开始,所以滑出效果延迟,没有立即开始。

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();
}

【问题讨论】:

  • 您可能想使用void QTimer::singleShot(int msec, QObject * receiver, const char * member)。这被描述为here
  • 看定位 - 太棒了!我会试一试:)

标签: qt qt4 qpropertyanimation


【解决方案1】:

Mezzo 的提示是针对的 - 再次感谢! - 但我插入了一个检查器以避免“闪烁效果”。 (当 slideIn 效果仍在运行时,始终等待静态毫秒数会导致异步 slideOut 效果。)

可能对答案感兴趣的人。 (我还修复了避免在每个动画触发器中分配的内存泄漏):

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;
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多