一、失去焦点检测
当窗口失去焦点时会发出FocusOut
事件,具体实现如下:
首先给窗口安装事件过滤器:
c
this->installEventFilter(this);
然后在事件过滤器函数中判断有没有失去焦点
cpp
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、实现源码
将动画封装成一个函数来使用
c
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);
}
三、抖动函数使用
cpp
bool MessageDialog::eventFilter(QObject *object, QEvent *event)
{
if(event->type() == QEvent::FocusOut)
{
this->widgetShake(this,50);
}
return QDialog::eventFilter(object,event);
}