一、失去焦点检测
当窗口失去焦点时会发出FocusOut
事件,具体实现如下:
首先给窗口安装事件过滤器:
this->installEventFilter(this);
然后在事件过滤器函数中判断有没有失去焦点
bool MessageDialog::eventFilter(QObject *object, QEvent *event)
{if(event->type() == QEvent::FocusOut){//窗口失去焦点了}return QDialog::eventFilter(object,event);
}
二、窗口抖动实现
窗口抖动使用QPropertyAnimation
来实现
1、QPropertyAnimation介绍
QPropertyAnimation是Qt提供的用于动画效果的类,它可以对Qt对象的属性进行动画处理。通过改变属性的值,可以实现平滑过渡、渐变效果等动画效果。
QPropertyAnimation继承自QAbstractAnimation类,它通过使用插值器(Interpolator)来控制属性值的变化速度,并通过使用适当的目标值和时间间隔来计算每一帧的属性值。
2、实现原理
在QPropertyAnimation
添加位置,左移位置->右移位置->左移位置…,然后将动画主体设置为窗口,启动动画就行。
3、实现源码
将动画封装成一个函数来使用
void MessageDialog::widgetShake(QWidget *widget, int range)
{int nX = widget->x();int nY = widget->y();QPropertyAnimation *pAnimation = new QPropertyAnimation(widget,"geometry");pAnimation->setEasingCurve(QEasingCurve::InOutSine);pAnimation->setDuration(300);pAnimation->setStartValue(QRect(QPoint(nX,nY),widget->size()));int nShakeCount = 20; //抖动次数double nStep = 1.0/nShakeCount;for(int i = 1; i < nShakeCount; i++){range = i&1 ? -range : range;pAnimation->setKeyValueAt(nStep*i,QRect(QPoint(nX + range,nY),widget->size()));}pAnimation->setEndValue(QRect(QPoint(nX,nY),widget->size()));pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
三、抖动函数使用
bool MessageDialog::eventFilter(QObject *object, QEvent *event)
{if(event->type() == QEvent::FocusOut){this->widgetShake(this,50);}return QDialog::eventFilter(object,event);
}