2015-11-02 156 views
0

当鼠标悬停在父窗口小部件(在“MyWidget”下面的代码片段中)时,我有一个小动画显示/隐藏框架。启动QPropertyAnimation延迟

动画只是简单地改变框架的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(); 
} 
+1

您可能想要使用void QTimer :: singleShot(int msec,QObject * receiver,const char * member)'。这是[这里]描述(http://doc.qt.io/qt-4.8/qtimer.html#singleShot)。 – Mezzo

+0

Look targeting - 太棒了!我会试一下 :) – 550

回答

0

从Mezzo的提示是针对 - 再次感谢! - 但我插入了一个检查器以避免“闪烁效应”。 (当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; 
}