来源:孤孤舟博客 此博客不错
http://guzhou.me/qt%e5%ae%9e%e7%8e%b0%e5%b1%80%e5%9f%9f%e7%bd%91%e8%81%8a%e5%a4%a9%e5%ae%a4%ef%bc%9a%e7%b1%bb%e4%bc%bcqq%e6%8a%96%e5%8a%a8%e7%aa%97%e5%8f%a3%e5%8a%9f%e8%83%bd%e7%9a%84%e5%ae%9e%e7%8e%b0/
在我们的子曰USay局域网聊天室中,与好友聊天时,可以点击输入框上面一排按钮中的抖动窗口按钮,即可给好友发送窗口抖动效果:
其实,抖动效果实现起来非常简单,基本的思路就是安装一个定时器,每隔一段时间去移动窗口的位置,到了一定时间就关闭定时器。
我将实现窗口抖动的效果封装到了一个类中,该类的定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#ifndef SHAKEWINDOW_H
#define SHAKEWINDOW_H
#include
#include
#include
//抖动的次数(移动窗口多少次)
enum
{MaxLimitTimes = 20};
//抖动的幅度(每次抖动改变的窗口位置大小)
enum
{MaxLimitSpace = 8};
//抖动定时器发生的时间间隔
enum
{ShakeSpeed = 30};
class
shakeWindow :
public
QObject
{
Q_OBJECT
public
:
shakeWindow(QDialog *dia,QObject *parent = 0);
void
startShake();
private
:
QDialog *dia;
QTimer* m_timer;
int
m_nPosition;
QPoint m_curPos;
private
slots:
void
slot_timerOut();
};
#endif // SHAKEWINDOW_H
|
该类的实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#include "shakewindow.h"
shakeWindow::shakeWindow(QDialog *dia,QObject *parent):QObject(parent)
{
this
->dia=dia;
m_timer=
new
QTimer(
this
);
QObject::connect(m_timer,SIGNAL(timeout()),
this
,SLOT(slot_timerOut()));
m_nPosition=MaxLimitTimes;
}
void
shakeWindow::startShake()
{
//如果正在抖动则返回
if
(m_nPosition < MaxLimitTimes)
return
;
m_nPosition=1;
m_curPos=
this
->dia->pos();
m_timer->start(ShakeSpeed);
}
void
shakeWindow::slot_timerOut()
{
//还没有抖动完毕
if
(m_nPosition < MaxLimitTimes)
{
++m_nPosition;
switch
(m_nPosition%4)
{
case
1:
{
QPoint tmpPos(m_curPos.x(),m_curPos.y()-MaxLimitSpace);
this
->dia->move(tmpPos);
}
break
;
case
2:
{
QPoint tmpPos(m_curPos.x()-MaxLimitSpace,m_curPos.y()-MaxLimitSpace);
this
->dia->move(tmpPos);
}
break
;
case
3:
{
QPoint tmpPos(m_curPos.x()-MaxLimitSpace,m_curPos.y());
this
->dia->move(tmpPos);
}
break
;
case
0:
default
:
this
->dia->move(m_curPos);
break
;
}
}
//抖动完毕,关闭定时器
else
{
m_timer->stop();
}
}
|
这个抖动类的构造函数接受一个QDialog*类型的参数,在需要应用抖动效果的聊天对话框类chatRoom中,有一个shakeWindow类型的成员变量:
1
2
3
4
5
6
7
8
|
class
chatRoom :
public
QDialog
{
......
private
:
shakeWindow shakeEffect;
}
|
然后在chatRoom类的构造函数中,构造这个成员变量:
1
2
3
4
5
6
7
|
chatRoom::chatRoom(
int
friendid,QWidget *parent) :
QDialog(parent),
ui(
new
Ui::chatRoom),
shakeEffect(
this
)
//构造抖动对象
{
......
}
|
最后,在需要发生抖动的地方调用:
1
|
shakeEffect.startShake();
|
这样就可以实习窗口抖动了!