当鼠标悬停父部件时,我有一个显示/隐藏框架的小动画(在“MyWidget”下面的代码片段中)。
动画简单地改变了框架的maximumWidth属性,使框架成为可见的某种“幻灯片效果”。(框架本身位于网格布局中。)
我的问题是如何启动动画延迟?示例:在鼠标leaveEvent之后启动500 is,因此滑出效果被延迟,并且没有立即启动.。
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();
}发布于 2015-11-10 15:32:21
来自Mezzo的暗示--再次感谢!--但是我插入了一个跳棋,以避免“闪烁效应”。(当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;
} https://stackoverflow.com/questions/33479629
复制相似问题