当鼠标悬停在父窗口小部件上时,我有一个显示/隐藏框架的小动画(在下面的代码片段中" MyWidget")。
动画只是简单地改变了框架的maximumWidth属性,因此框架变得可见,因为某些"滑入效果"。 (框架本身位于网格布局中。)
我的问题是如何启动动画延迟?示例:在鼠标leaveEvent后启动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();
}
答案 0 :(得分:0)
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;
}